programing

다른 목록에서 한 목록에서 항목 제거

subpage 2023. 4. 14. 21:42
반응형

다른 목록에서 한 목록에서 항목 제거

다른 아이템 리스트에서 삭제하고 싶은 아이템의 일반적인 리스트를 트래버스 하는 방법을 찾고 있습니다.

예를 들어 제가 이걸 가정해 보겠습니다.

List<car> list1 = GetTheList();
List<car> list2 = GetSomeOtherList();

list1을 foreach로 트래버스하여 List2에 포함된 List1의 각 항목을 제거하고 싶습니다.

Foreach는 인덱스를 기반으로 하지 않기 때문에 나는 그것을 어떻게 해야 할지 잘 모르겠습니다.

다음을 제외하고 사용할 수 있습니다.

List<car> list1 = GetTheList();
List<car> list2 = GetSomeOtherList();
List<car> result = list2.Except(list1).ToList();

이러한 임시 변수는 필요하지 않을 수도 있습니다.

List<car> result = GetSomeOtherList().Except(GetTheList()).ToList();

주의:Except는 어떤 목록도 수정하지 않습니다.결과와 함께 새 목록을 만듭니다.

인덱스는 필요 없습니다.List<T>class를 사용하면 인덱스가 아닌 값으로 항목을 삭제할 수 있습니다.Remove기능.

foreach(car item in list1) list2.Remove(item);

제 경우엔 외국 키와 같은 공통 식별자를 가진 두 개의 다른 목록이 있었습니다."nzrytmn"에서 인용한 두 번째 솔루션:

var result =  list1.Where(p => !list2.Any(x => x.ID == p.ID && x.property1 == p.property1)).ToList();

내 상황에 가장 잘 맞는 사람이었어이미 등록된 레코드가 없는 상태에서 Drop Down List를 로드해야 했습니다.

감사합니다!!!

코드는 다음과 같습니다.

t1 = new T1();
t2 = new T2();

List<T1> list1 = t1.getList();
List<T2> list2 = t2.getList();

ddlT3.DataSource= list2.Where(s => !list1.Any(p => p.Id == s.ID)).ToList();
ddlT3.DataTextField = "AnyThing";
ddlT3.DataValueField = "IdAnyThing";
ddlT3.DataBind();

LINQ 확장 방식을 사용할 것을 권장합니다.다음과 같이 한 줄의 코드로 간단하게 할 수 있습니다.

list2 = list2.Except(list1).ToList();

이는 물론 list2에서 삭제하는 list1 내의 객체가 동일한 인스턴스라고 가정합니다.

list1.RemoveAll(l => list2.Contains(l));

LINQ를 사용할 수 있지만, 저는 이 기능을 사용하는 것이 좋습니다.RemoveAll방법.그게 당신의 의도를 더 잘 표현하는 것 같아요.

var integers = new List<int> { 1, 2, 3, 4, 5 };

var remove = new List<int> { 1, 3, 5 };

integers.RemoveAll(i => remove.Contains(i));

해결책 1: 다음과 같이 할 수 있습니다.

List<car> result = GetSomeOtherList().Except(GetTheList()).ToList();

그러나 경우에 따라서는 이 솔루션이 작동하지 않을 수 있습니다.만약 효과가 없다면 당신은 나의 두 번째 솔루션을 사용할 수 있습니다.

솔루션 2:

List<car> list1 = GetTheList();
List<car> list2 = GetSomeOtherList();

list1이 메인리스트이고 list2가 세컨드라이 리스트라고 가정하고 list2의 아이템을 제외하고 list1의 아이템을 취득하려고 합니다.

 var result =  list1.Where(p => !list2.Any(x => x.ID == p.ID && x.property1 == p.property1)).ToList();

~하듯이Except리스트는 수정되지 않습니다.ForEach를 사용할 수 있습니다.List<T>:

list2.ForEach(item => list1.Remove(item));

가장 효율적인 방법은 아니지만 단순하기 때문에 읽을 수 있으며 원본 목록(제 요구 사항)을 업데이트합니다.

목록 A를 사전으로 변환한 다음 두 번째 목록을 포워딩하고 전화를 하는 것이 빠를 것 같습니다.DictA.Remove(item)그렇지 않으면 대부분의 솔루션이 목록 A를 통해 직접 또는 커버 아래에서 많은 반복을 일으킬 것이라고 생각합니다.

명단이 적으면 아마 문제가 되지 않을 거예요.

DataModals가 다른 두 개의 다른 목록이 있는 경우

List<FeedbackQuestionsModel> feedbackQuestionsList = new();

List<EmployeesFeedbacksQuestionsModel> employeeQuestionsList = new();

var resultList = feedbackQuestionsList.Where(p => !employeeQuestionsList.Any(x => x.Question == p.Question)).ToList();
feedbackQuestionsList = resultList.ToList();

여기 있습니다.

    List<string> list = new List<string>() { "1", "2", "3" };
    List<string> remove = new List<string>() { "2" };

    list.ForEach(s =>
        {
            if (remove.Contains(s))
            {
                list.Remove(s);
            }
        });

언급URL : https://stackoverflow.com/questions/2745544/remove-items-from-one-list-in-another

반응형