Проверьте, содержит ли список какой-либо другой список


у меня есть список параметров, как это:

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 и как методы расширения на перечислимых, например, где и т. д. поэтому вложенные foreaches просто чувствуют себя неправильно. Есть ли более элегантный предпочтительный способ linq/lambda / delegete для этого.

спасибо

1 56

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(); 

также в качестве побочного комментария вы должны заглавными буквами указывать имена классов и имена свойств в соответствии с C# рекомендации по стилю.