[C#] 한 목록에서 다른 목록의 항목 제거

다른 항목 목록에서 제거하려는 일반 항목 목록을 탐색하는 방법을 알아 내려고합니다.

가설의 예로 이것을 가지고 있다고합시다.

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

foreach로 list1을 순회하고 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>클래스를 사용하면 Remove함수 를 사용하여 인덱스가 아닌 값으로 항목을 제거 할 수 있으므로 인덱스가 필요하지 않습니다 .

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


답변

LINQ 확장 방법을 사용하는 것이 좋습니다 . 한 줄의 코드로 쉽게 수행 할 수 있습니다.

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

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


답변

필자의 경우 외래 키와 같은 공통 식별자가있는 두 개의 다른 목록이있었습니다. “nzrytmn”에 의해 인용 된 두 번째 해결책 :

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

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

감사합니다 !!!

이것은 내 코드입니다.

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를 사용할 수는 있지만 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));


답변

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


답변

솔루션 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();