Mam listę parametrów takich jak ta:
public class parameter
{
public string name {get; set;}
public string paramtype {get; set;}
public string source {get; set;}
}
IEnumerable<Parameter> parameters;
I tablicę ciągów, z którymi chcę to porównać.
string[] myStrings = new string[] { "one", "two"};
Chcę iterować listę parametrów i sprawdzić, czy właściwość source jest równa dowolnej z tablicy myStrings. Mogę to zrobić z zagnieżdżonymi foreach, ale chciałbym nauczyć się, jak to zrobić w przyjemniejszy sposób, ponieważ bawiłem się linq i podobały mi się metody rozszerzające na wyliczalnych, takich jak gdzie itp., Więc zagnieżdżone foreach po prostu czują się źle. Czy istnieje bardziej elegancki preferowany sposób linq / lambda / delegete?
Dzięki
Intersect
będzie szybszy - jeśli listy są trywialnie krótkie, nie ma to znaczenia (w takim przypadku wydajność prawdopodobnie i tak nie jest dla Ciebie ważna )parameters.Any(x => myStrings.Contains(x.source));
byłby lepszy niż twój pierwszy przykład?Oto przykład, aby sprawdzić, czy na innej liście znajdują się pasujące elementy
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!"); }
źródło
Intersect
podejście, ponieważ jest to O (N * M) w rozmiarach list. (W pamięci jest O (1).)Jeśli obie listy są zbyt duże i użyjemy wyrażenia lamda, pobranie zajmie dużo czasu. W tym przypadku lepiej użyć linq do pobrania listy parametrów:
var items = (from x in parameters join y in myStrings on x.Source equals y select x) .ToList();
źródło