Подтвердить что ты не робот

Проверьте, содержит ли список <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 для этого.

Спасибо

4b9b3361

Ответ 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();