我试图理解下面使用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);
我不清楚
vm
如何获得其类型?它没有在对象实例的其他地方定义。
FirstOrDefault(vm => vm is AllCustomersViewModel)
如何满足source
的{{1}}参数要求?这是不是暗示了什么?
我一直在尝试使用这些资源来解析它:
答案 0 :(得分:6)
vm
获取其类型,因为Workspaces
是包含特定类型的集合。 vm
会自动推断为该类型。
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的实例。