Проверьте, содержит ли список <t> любой другой список
У меня есть список таких параметров:
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"};
Я хочу перебрать список параметров и проверить, соответствует ли свойство source любому из массива myStrings. Я могу сделать это с помощью вложенного foreach, но я хотел бы узнать, как сделать это лучше, поскольку я играл с linq и, как и методы расширения, перечислял, например, где и т.д., Так что вложенные foreachs просто чувствуют себя не так. Есть ли более элегантный предпочтительный способ linq/lambda/delegete для этого.
Спасибо
Ответы
Ответ 1
Вы можете использовать вложенный Any()
для этой проверки, который доступен на любом Enumerable
:
bool hasMatch = myStrings.Any(x => parameters.Any(y => y.source == x));
Более быстрое выполнение в больших коллекциях будет состоять в том, чтобы проецировать parameters
в source
, а затем использовать Intersect
, который внутренне использует HashSet<T>
, поэтому вместо O (n ^ 2) для первого подхода (эквивалент двух вложенные петли) вы можете выполнить проверку O (n):
bool hasMatch = parameters.Select(x => x.source)
.Intersect(myStrings)
.Any();
Также в качестве побочного комментария вы должны использовать имена классов и имена классов для соответствия стилям стиля С#.
Ответ 2
Вот пример, чтобы найти, есть ли элементы соответствия в другом списке
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!");
}
Ответ 3
Если оба списка слишком велики, и когда мы используем лямда-выражение, выборка займет много времени. В этом случае лучше использовать linq для получения списка параметров:
var items = (from x in parameters
join y in myStrings on x.Source equals y
select x)
.ToList();