Проверьте, содержит ли список какой-либо другой список
у меня есть список параметров, как это:
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 ответ:
вы можете использовать вложенный
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# рекомендации по стилю.