다른 목록에서 한 목록에서 항목 제거
다른 아이템 리스트에서 삭제하고 싶은 아이템의 일반적인 리스트를 트래버스 하는 방법을 찾고 있습니다.
예를 들어 제가 이걸 가정해 보겠습니다.
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
'programing' 카테고리의 다른 글
SourceKit 서비스가 종료되었습니다. (0) | 2023.04.14 |
---|---|
VBA와 VSTO의 차이점은 무엇입니까? 업그레이드해야 합니까? (0) | 2023.04.14 |
LINQ를 사용하여 리스트에서 요소 제거 (0) | 2023.04.14 |
gnu cp 명령을 사용하여 파일을 여러 디렉토리에 복사하는 방법 (0) | 2023.04.14 |
부울 목록을 기준으로 목록 필터링 (0) | 2023.04.14 |