2010-02-10 4 views
5

Вот два C# классы ...Что делает этот запрос LINQ?

public class Address 
{ 
    public string Country; 
    public string City; 
} 

public class Traveller 
{  
    public string Name; 
    public List<Address> TravelRoute; 
} 

... и список данных (заполненные где-то) ...

List<Traveller> Travellers; 

... и этот запрос LINQ:

var result = from t in Travellers 
      where t.TravelRoute.Any(a => a.Country == "F") 
      select t; 

foreach (var t in result) 
    System.Console.WriteLine(t.Name); 

Я не понимаю вопрос: что означает функция «Any» и что делает оператор «=>»?

Может кто-нибудь объяснить мне, что происходит в этом коде? Благодаря!

ответ

1

Линия

 
a => a.Country == "F" 

бы перевести на что-то вроде этого, если он был отделен LINQ заявление:

 
From a as Adress in t.TravelRoute 
Where a.Country = "F" 
Select a 

ЛЮБЫМ означает, что он: Любые. Другими словами, он возвращает истину, если любой из объектов в travelRoute имеет свойство Country в «F»

Надежда, что помогает

+0

Итак, означает ли это, что это «лямбда-выражение» является лишь аббревиатурой для другого «вложенного» запроса LINQ? Только что написать код более компактный? – Slauma

+0

Лямбда-выражение, также известное как встроенное выражение, обычно записывается для одноразовой функции и обычно более компактно. Вам не нужно указывать тип аргумента, поскольку он будет выводить его. Я бы сказал, что да, вы можете заменить его вложенным LINQ, но я не знаю LINQ, чтобы сказать, что запись LINQ, которую я написал в другом LINQ, будет работать именно так. –

+0

Чтобы быть более точным, выражение лямбда также может быть переведено в дерево выражений, которое используется поставщиком LINQ для перевода на другой фрагмент кода, например выражение SQL. –

7

Он выбирает всех путешественников, чей TravelRoute содержит страну, которая является «F».

Функции Any возвращают true, если какой-либо из объектов в списке удовлетворяет условию, которое передается функции. Из подписи метода вы можете видеть, что он принимает делегата Func<>, который возвращает bool. Это означает, что он принимает любой метод, который возвращает логическое значение, включая предоставленное выражение лямбда.

Это отличается от Where, который будет фильтровать в соответствии с условием, что передается в.

=> является lambda expression. В этом конкретном случае это ярлык для записи anonymous delegate.

+3

Это, вероятно, стоит отметить, что 'Any' является аналогом' All' ; 'All' возвращает true, когда * каждый * элемент коллекции удовлетворяет условию (по существу длинная строка операторов' и ​​') и коротких замыканий на' false' при ошибке, тогда как 'Any' возвращает true, когда * любые * элементы коллекции удовлетворяет условию (по существу, длинной строке операторов 'или') и коротких замыканий на 'true' на проходе. –

+0

Я не думаю, что это правильно выражено.Ключевое слово 'where' выбирает любой объект, который удовлетворяет условию, в этом случае условие состоит в том, что должно быть хотя бы одно TravelRoute, для которого предикат возвращает true. Я думаю, важно отметить разницу. –

+0

Спасибо Адаму, это объяснение «Любого» было совершенно ясно! – Slauma

0

Это выражение лямбда. http://msdn.microsoft.com/en-us/library/bb397687.aspx Похоже, что он выбирает всех путешественников, у которых есть любой маршрут путешествия в «F», который предположительно является страной.

0

Любой метод фильтрации, в котором говорится: «Принять любые предметы, которые отвечают следующим критериям». Бизнес a => ... означает «Учитывая параметр a, вот метод», как говорили другие, он используется для лямбда-выражений. Edit: изменилось «свойство» в «параметр»

+0

Как компилятор может узнать, в каком типе параметр a? Тип не указан, есть только. Но я даже получаю Intellisense, который предлагает мне член Страны. Это хорошо и правильно, но трудно понять ... – Slauma

+0

Лямбда-выражение обычно загадочно в их синтаксисе, но оно мало и эффективно. –

+0

Компилятор часто может вывести тип, как вы его используете. В этом случае для функции Any() требуется параметр типа Func , то есть он хочет получить функцию, которая принимает строку, и возвращает bool - стандартную функцию фильтра. Вот как компилятор знает, как обращаться с лямбдой, и если вы написали лямбда для возврата int, например, вы получите ошибку компилятора. – expedient

Смежные вопросы