Объясните ниже Linq Query? - PullRequest
3 голосов
/ 21 июля 2011
results.Where(x=>x.Members.Any(y=>members.Contains(y.Name.ToLower())

Я случайно увидел этот запрос в интернете. Может кто-нибудь объяснить этот запрос, пожалуйста.

предложите мне хороший учебник по LINQ для этого новичка.

спасибо всем.

Отредактировано:

что это за x и y обозначает?

Ответы [ 4 ]

3 голосов
/ 21 июля 2011
  • x - это одиночный результат типа элементов в последовательности results.
  • y - это отдельный член типа элементов в x.Members sequence.

Это лямбда-выражения (x => x.whatever), которые были введены в язык с C # 3, где x - это ввод, а правая сторона (x.whatever) -вывод (в данном конкретном сценарии использования).

Более простой пример

var list = new List<int> { 1, 2, 3 };
var oddNumbers = list.Where(i => i % 2 != 0);

Здесь i - это отдельный элемент int, который является входом в выражение.i % 2 != 0 - логическое выражение, оценивающее, является ли ввод четным или нечетным.Полное выражение (i => i % 2 != 0) является предикатом, Func<int, bool>, где входное значение является целым числом, а выходное значение - логическим.Следить?При выполнении итерации по запросу oddNumbers каждый элемент в последовательности list сравнивается с предикатом.Те, которые проходят, становятся частью вашего выхода.

foreach (var item in oddNumbers)
    Console.WriteLine(item);

// writes 1, 3
1 голос
/ 21 июля 2011

Интересный запрос, но мне он не нравится.

Сначала я отвечу на ваш второй вопрос.x и y являются параметрами лямбда-методов, которые определены в вызовах Where() и Any().Вы можете легко изменить имена, чтобы они были более значимыми:

results.Where(result => 
    result.Members.Any(member => members.Contains(member.Name.ToLower());

И чтобы ответить на ваш первый вопрос, этот запрос вернет каждый элемент в results, где в коллекции Members есть хотя бы один элемент, которыйтакже содержится в коллекции Members в виде строчной строчки.

Логика там не имеет большого смысла для меня, зная, что такое коллекция Members или что она содержит.

1 голос
/ 21 июля 2011

Это лямбда-выражение . Здесь отличный учебник LINQ

0 голосов
/ 21 июля 2011

х будет каждый экземпляр коллекции результатов.В запросе используется лямбда-синтаксис, поэтому x => x. somemember означает «вызывать somemember для каждого переданного x. Где находится метод расширения для IEnumerables, который ожидает функцию, которая примет аргумент и вернет логическое значение.Лямбда-синтаксис создает делегаты под прикрытием, но гораздо более выразителен для выполнения определенных типов операций (и экономит много времени при наборе текста).

Не зная типа объектов, содержащихся в сборе результатов (результаты будутчто-то, что реализует IEnumerable), трудно точно знать, что будет делать приведенный выше код. Но уместное предположение состоит в том, что он проверит все члены всех x в приведенной выше коллекции и вернет вам IEnumerable только тех, которые имеютчлены со всеми строчными именами.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...