Использование лямбда-выражения в универсальном методе в универсальной коллекции - PullRequest
1 голос
/ 28 января 2011

Я пытаюсь понять приведенное ниже использование лямбда-выражения. Этот код взят из превосходного демонстрационного кода MVSM Джоша Смита (http://msdn.microsoft.com/en-us/magazine/dd419663.aspx#id0090055).

Метод вызывается следующим образом:

AllCustomersViewModel workspace =
                this.Workspaces.FirstOrDefault(vm => vm is AllCustomersViewModel)
                as AllCustomersViewModel;

Как здесь используется, FirstOrDefault имеет следующее определение, определенное Visual Studio 2010:

public static TSource FirstOrDefault<TSource>(this IEnumerable<TSource> source, Func<TSource, bool> predicate);

Мне не понятно

  1. Как vm получает свой тип? Он не определен где-либо еще в экземпляре объекта.

  2. Как FirstOrDefault(vm => vm is AllCustomersViewModel) удовлетворяет требованию source параметра FirstOrDefault? Это как-то подразумевается?

Я пытался использовать эти ресурсы для разбора:

http://msdn.microsoft.com/en-us/library/bb397687.aspx

http://msdn.microsoft.com/en-us/library/bb397951.aspx

Ответы [ 3 ]

6 голосов
/ 28 января 2011
  1. vm получает свой тип, потому что Workspaces - это коллекция, которая содержит определенный тип.vm автоматически определяется как этот тип.

  2. Параметр source для FirstOrDefault равен Workspaces. Это метод расширения для IEnumerable<T>Таким образом, экземпляр, который вы вызываете, занимает место первого параметра.Вот что означает this в сигнатуре метода.

2 голосов
/ 28 января 2011

Другие ответили на сам вопрос.Впрочем, этот код был бы более понятен как:

AllCustomersViewModel workspace = this.Workspaces.OfType<AllCustomersViewModel>()
                                                 .FirstOrDefault();

Зачем создавать свой собственный оператор, если LINQ уже включает его?( OfType )

1 голос
/ 28 января 2011

Предикат <TSource, bool> имеет первый параметр, выведенный, как упомянуто выше, второй параметр (логический) затем задается лямбда-выражением vm => vm is AllCustomersViewModel

Смысл в том, чтобы дать мне первое (или значение по умолчанию, если таковое не существует) Рабочее пространство, где элемент является экземпляром AllCustomersViewModel.

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