Saya memiliki daftar parameter seperti ini:
public class parameter
{
public string name {get; set;}
public string paramtype {get; set;}
public string source {get; set;}
}
IEnumerable<Parameter> parameters;
Dan serangkaian string yang ingin saya periksa.
string[] myStrings = new string[] { "one", "two"};
Saya ingin mengulang daftar parameter dan memeriksa apakah properti sumber sama dengan salah satu array myStrings. Saya dapat melakukan ini dengan foreach bersarang tetapi saya ingin belajar bagaimana melakukannya dengan cara yang lebih baik karena saya telah bermain-main dengan LINQ dan seperti metode ekstensi pada enumerable seperti di mana dll sehingga foreachs bersarang hanya merasa salah. Apakah ada cara linq / lambda / delegete yang lebih elegan untuk melakukan ini.
Terima kasih
Intersect
akan lebih cepat - jika daftarnya pendek, tidak masalah satu atau lain cara (dalam hal ini kinerja mungkin bukan urusan Anda sama sekali )parameters.Any(x => myStrings.Contains(x.source));
lebih baik dari contoh pertama Anda?Berikut adalah contoh untuk mengetahui apakah ada elemen yang cocok di daftar lain
List<int> nums1 = new List<int> { 2, 4, 6, 8, 10 }; List<int> nums2 = new List<int> { 1, 3, 6, 9, 12}; if (nums1.Any(x => nums2.Any(y => y == x))) { Console.WriteLine("There are equal elements"); } else { Console.WriteLine("No Match Found!"); }
sumber
Intersect
pendekatannya, karena O (N * M) dalam ukuran daftar. (Ini adalah O (1) dalam ingatan.)Jika kedua daftar terlalu besar dan ketika kita menggunakan ekspresi lamda maka akan memakan waktu lama untuk diambil. Lebih baik menggunakan linq dalam kasus ini untuk mengambil daftar parameter:
var items = (from x in parameters join y in myStrings on x.Source equals y select x) .ToList();
sumber