在泛型集合的泛型方法上使用表达式lambda

时间:2011-01-28 16:57:27

标签: c# generics mvvm lambda

我试图理解下面使用lambda表达式。此代码取自Josh Smith出色的MVVM演示代码(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的{​​{1}}参数要求?这是不是暗示了什么?

  3. 我一直在尝试使用这些资源来解析它:

      

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

         

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

3 个答案:

答案 0 :(得分:6)

  1. vm获取其类型,因为Workspaces是包含特定类型的集合。 vm会自动推断为该类型。

  2. source的{​​{1}}参数为FirstOrDefault这是Workspaces.上的extension method,因此您调用它的实例取代第一个参数。这就是方法签名中IEnumerable<T>的含义。

答案 1 :(得分:2)

其他人已经回答了这个问题。尽管如此,这段代码会更加清晰:

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

当LINQ已包含一个时,为什么还要创建自己的运算符呢? (OfType

答案 2 :(得分:1)

<TSource, bool>谓词具有如上所述推断的第一个参数,第二个参数(布尔值)随后由lambda表达式vm => vm is AllCustomersViewModel提供

意思是给我第一个(或者如果不存在则为默认值)工作区,其中项是AllCustomersViewModel的实例。

相关问题