Soru LINQ - Başka bir listede olmayan tüm listedeki tüm öğeleri bulun


Bir LINQ sorgusuyla (veya aynı şeyi gerçekleştirmenin başka etkili yollarıyla) sıkışıp kaldım. Birisi bana başka bir listede olmayan bir listedeki tüm öğeleri nasıl seçebileceğimi gösterebilir mi?

Temel olarak, diğer iki liste arasındaki eşleştirmelerle oluşturduğum bir listem var. İlk listede bulunan eşleşmelerin bulunamadığını bulmam gerekiyor. Birisi, bu hedefe ulaşacak sorgu ile aşağıdaki ikinci LINQ sorgusunda yıldızları doldurabilir mi? TSQL kullanıyor olsaydım, yapardım SELECT * NOT IN ()ama sanırım LINQ buna izin vermiyor.

//Create some sample lists.
List<IdentifierLookupData> list1 = new List<IdentifierLookupData> { /*Init */ };
List<IdentifierLookupData> list2 = new List<IdentifierLookupData> { /*Init */ };

//Find all items in list1 and list2 that match and store them in joinItems.
var joinItems = (from d1 in list1
    join d2 in list2 on d1 equals d2
    select d1).ToList<IdentiferLookupData>();

//Find all items in list1 not in joinItems.
var deletedItems = (from d1 in list1
     ***select all items not found in joinItems list.***

36
2017-07-10 17:45


Menşei


Tam başlığınız google'da aranıyor: google.com/... - Joe
@JoeTuskan Ve henüz soru oy aldı! - dlev
Google'da bir şey bulabilirim, SO iyi bir site çünkü 30 saniye içinde bir soru yazabilirim, başka bir şey üzerinde çalışabilirim ve herhangi bir zaman kaybetmeden veya muhtemelen verimsiz ilk google cevap ve israfını kullanmadan mükemmel bir uzmanla tartışılan cevabı alabilirim işlerimi bitirmek için para alırken kendimi bulma zamanı: p - John Humphreys - w00te
olası kopyası Bir Listeye <>, başka bir listede olmayan öğeleri almak için LINQ kullanın <> - Jim G.


Cevaplar:


Kullanmayı deneyin .Except uzatma yöntemi (Dokümanlar):

var result = list1.Except(list2);

size tüm öğeleri verecek list1 içinde değil list2.


87
2017-07-10 17:47



Ama sadece IdentifierLookupData uygular IEquatable<IdentifierLookupData> - Tim Schmelter
Aslında hiç joinItems listesine ihtiyacınız yok. İhtiyacınız olan tek şey list1 ve list2 list2 list1'de olmayan tüm öğeleri almak. Muhtemelen ppl bu cevabı oylama nedeni - Dimitri
Teşekkürler, çekicilik gibi çalıştı. - John Humphreys - w00te


En kolay yol Except yöntem.

var deletedItems = list1.Except(joinItems);

Bu, öğeler kümesini list1 içinde yer almayan joinItems


11
2017-07-10 17:46





Bunu dene:

var List2 = OriginalList.Where(item => !List1.Any(item2 => item2.ID == item.ID));

8
2018-05-15 02:15



Bunu beğendim çünkü Tarihler gibi iki farklı liste için kullanabilirim. Orijinal listeyi başka bir listeye göre filtrelemem gereken yer. +1 - ppumkin