У меня есть список таких параметров:
public class parameter
{
public string name {get; set;}
public string paramtype {get; set;}
public string source {get; set;}
}
IEnumerable<Parameter> parameters;
И массив строк, который я хочу проверить.
string[] myStrings = new string[] { "one", "two"};
Я хочу перебрать список параметров и проверить, равно ли исходное свойство какому-либо из массива myStrings. Я могу сделать это с помощью вложенных foreach, но я хотел бы узнать, как это сделать лучше, поскольку я играл с linq и мне нравились методы расширения в enumerable, например where и т.д., поэтому вложенные foreach просто кажутся неправильными. Есть ли более элегантный предпочтительный способ linq / lambda / delegete для этого.
Благодарность
Intersect
будет быстрее - если списки тривиально короткие, это не имеет значения так или иначе (в этом случае производительность, вероятно, в любом случае не является вашей проблемой )parameters.Any(x => myStrings.Contains(x.source));
лучше, чем ваш первый пример?Вот пример, чтобы узнать, есть ли совпадающие элементы в другом списке
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!"); }
источник
Intersect
подход, поскольку это O (N * M) в размерах списков. (Хотя это O (1) в памяти.)Если оба списка слишком велики и когда мы используем lamda-выражение, выборка займет много времени. В этом случае лучше использовать linq для получения списка параметров:
var items = (from x in parameters join y in myStrings on x.Source equals y select x) .ToList();
источник