Apa cara tercepat untuk menentukan apakah satu IEnumerable berisi semua elemen IEnumerable lain saat membandingkan bidang / properti dari setiap elemen di kedua koleksi?
public class Item
{
public string Value;
public Item(string value)
{
Value = value;
}
}
//example usage
Item[] List1 = {new Item("1"),new Item("a")};
Item[] List2 = {new Item("a"),new Item("b"),new Item("c"),new Item("1")};
bool Contains(IEnumerable<Item> list1, IEnumerable<Item>, list2)
{
var list1Values = list1.Select(item => item.Value);
var list2Values = list2.Select(item => item.Value);
return //are ALL of list1Values in list2Values?
}
Contains(List1,List2) // should return true
Contains(List2,List1) // should return false
c#
.net
linq
ienumerable
Brandon Zacharie
sumber
sumber
Jawaban:
Tidak ada "cara cepat" untuk melakukan ini kecuali Anda melacak dan mempertahankan beberapa status yang menentukan apakah semua nilai dalam satu koleksi dimuat di koleksi lain. Jika Anda hanya harus
IEnumerable<T>
melawan, saya akan menggunakanIntersect
.Performa ini harus sangat masuk akal, karena
Intersect()
akan menghitung setiap daftar hanya sekali. Selain itu, panggilan kedua keCount()
akan optimal jika tipe yang mendasarinyaICollection<T>
bukan hanya sebuahIEnumerable<T>
.sumber
Anda juga bisa menggunakan Kecuali untuk menghapus dari daftar pertama semua nilai yang ada di daftar kedua, dan kemudian memeriksa apakah semua nilai telah dihapus:
Metode ini memiliki keuntungan karena tidak memerlukan dua panggilan ke Count ().
sumber
C # 3.5+
Menggunakan
Enumerable.All<TSource>
untuk menentukan apakah semua item List2 terkandung dalam List1:Ini juga akan bekerja ketika list1 berisi lebih dari semua item list2.
sumber
Contains()
panggilan dalamAll()
panggilan.bool hasAll = list2Uris.All(list1Uris.Contains);
Jawaban Kent bagus dan singkat, tetapi solusi yang dia berikan selalu membutuhkan pengulangan atas seluruh koleksi pertama. Berikut kode sumbernya:
Itu tidak selalu dibutuhkan. Jadi, inilah solusi saya:
Sebenarnya, Anda harus berpikir tentang menggunakan
ISet<T>
(HashSet<T>
). Ini berisi semua metode set yang diperlukan.IsSubsetOf
dalam kasus Anda.sumber
Operator Linq, SequenceEqual akan bekerja juga (tetapi sensitif terhadap item enumerable yang berada dalam urutan yang sama)
sumber
Solusi yang ditandai sebagai jawaban akan gagal dalam kasus pengulangan. Jika IEnumerable Anda hanya berisi nilai yang berbeda maka itu akan berlalu.
Jawaban di bawah ini adalah untuk 2 daftar dengan pengulangan:
sumber
Anda harus menggunakan HashSet, bukan Array.
Contoh:
Referensi
Satu-satunya batasan HasSet adalah kita tidak bisa mendapatkan item dengan indeks seperti List atau mendapatkan item dengan Key seperti Kamus. Yang dapat Anda lakukan hanyalah menghitungnya (untuk masing-masing, sementara, dll)
Tolong beri tahu saya jika itu berhasil untuk Anda
sumber
Anda dapat menggunakan metode ini untuk membandingkan dua daftar
sumber