Saya akan berasumsi ada permintaan LINQ sederhana untuk melakukan ini, saya hanya tidak yakin bagaimana caranya.
Diberikan potongan kode ini:
class Program
{
static void Main(string[] args)
{
List<Person> peopleList1 = new List<Person>();
peopleList1.Add(new Person() { ID = 1 });
peopleList1.Add(new Person() { ID = 2 });
peopleList1.Add(new Person() { ID = 3 });
List<Person> peopleList2 = new List<Person>();
peopleList2.Add(new Person() { ID = 1 });
peopleList2.Add(new Person() { ID = 2 });
peopleList2.Add(new Person() { ID = 3 });
peopleList2.Add(new Person() { ID = 4 });
peopleList2.Add(new Person() { ID = 5 });
}
}
class Person
{
public int ID { get; set; }
}
Saya ingin melakukan kueri LINQ untuk memberi saya semua orang peopleList2
yang tidak masuk peopleList1
.
Contoh ini harus memberi saya dua orang (ID = 4 & ID = 5)
Jawaban:
Ini dapat diatasi menggunakan ekspresi LINQ berikut:
Cara alternatif untuk mengekspresikan ini melalui LINQ, yang menurut beberapa pengembang lebih mudah dibaca:
sumber
Jika Anda mengesampingkan kesetaraan Orang maka Anda juga dapat menggunakan:
Except
harus secara signifikan lebih cepat daripadaWhere(...Any)
varian karena dapat menempatkan daftar kedua ke dalam hashtable.Where(...Any)
memiliki runtimeO(peopleList1.Count * peopleList2.Count)
sedangkan varian berdasarkanHashSet<T>
(hampir) memiliki runtimeO(peopleList1.Count + peopleList2.Count)
.Except
secara implisit menghapus duplikat. Itu seharusnya tidak mempengaruhi kasus Anda, tetapi mungkin menjadi masalah untuk kasus serupa.Atau jika Anda ingin kode cepat tetapi tidak ingin menimpa kesetaraan:
Varian ini tidak menghapus duplikat.
sumber
Equals
telah diganti untuk membandingkan ID.Atau jika Anda menginginkannya tanpa negasi:
Pada dasarnya dikatakan get all from peopleList2 di mana semua id di peopleList1 berbeda dari id di peopleList2.
Hanya sedikit pendekatan yang berbeda dari jawaban yang diterima :)
sumber
Karena semua solusi hingga saat ini menggunakan sintaks fasih, berikut adalah solusi dalam sintaks ekspresi kueri, untuk mereka yang tertarik:
Saya pikir itu cukup berbeda dari jawaban yang diberikan untuk menarik bagi beberapa orang, bahkan berpikir itu kemungkinan besar akan kurang optimal untuk Daftar. Sekarang untuk tabel dengan ID yang diindeks, ini pasti akan menjadi cara untuk pergi.
sumber
Agak terlambat ke pesta tetapi solusi bagus yang juga kompatibel dengan Linq untuk SQL adalah:
Selamat untuk http://www.dotnet-tricks.com/Tutorial/linq/UXPF181012-SQL-Joins-with-C
sumber
Jawaban Klaus luar biasa, tetapi ReSharper akan meminta Anda untuk "Sederhanakan ekspresi LINQ":
var result = peopleList2.Where(p => peopleList1.All(p2 => p2.ID != p.ID));
sumber
Ekstensi Enumerable ini memungkinkan Anda untuk menentukan daftar item untuk dikecualikan dan fungsi yang akan digunakan untuk menemukan kunci yang digunakan untuk melakukan perbandingan.
Anda bisa menggunakannya dengan cara ini
sumber
Berikut ini adalah contoh kerja yang mendapatkan keterampilan TI yang belum dimiliki oleh seorang calon pekerja.
sumber
pertama, ekstrak id dari koleksi di mana kondisinya
kedua, gunakan "bandingkan" untuk memilih id berbeda dengan seleksi
Jelas Anda dapat menggunakan x.key! = "TEST", tetapi hanya sebuah contoh
sumber
Setelah Anda menulis FuncEqualityComparer generik Anda dapat menggunakannya di mana saja.
sumber