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

C# 在泛型集合的泛型方法上使用表达式lambda,c#,generics,mvvm,lambda,C#,Generics,Mvvm,Lambda,我试图理解以下lambda表达式的用法。此代码取自Josh Smith优秀的MVVM演示代码http://msdn.microsoft.com/en-us/magazine/dd419663.aspxid0090055. 方法的调用如下所示: AllCustomersViewModel workspace = this.Workspaces.FirstOrDefault(vm => vm is AllCustomersViewModel)

我试图理解以下lambda表达式的用法。此代码取自Josh Smith优秀的MVVM演示代码http://msdn.microsoft.com/en-us/magazine/dd419663.aspxid0090055.

方法的调用如下所示:

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是如何获得其类型的?它没有在对象实例的其他位置定义

FirstOrDefaultvm=>vm是如何满足FirstOrDefault的源参数要求的?这是否暗示了什么

我一直在尝试使用这些资源来分析这一点:

vm获取其类型,因为工作空间是包含特定类型的集合。vm会自动推断为该类型

FirstOrDefault的源参数是Workspace。它是IEnumerable上的一个实例,因此调用它的实例将取代第一个参数。这就是方法签名中的this的含义

vm获取其类型,因为工作空间是包含特定类型的集合。vm会自动推断为该类型

FirstOrDefault的源参数是Workspace。它是IEnumerable上的一个实例,因此调用它的实例将取代第一个参数。这就是方法签名中的this的含义

谓词具有如上所述推断的第一个参数,布尔值随后由lambda表达式vm=>vm提供的第二个参数是AllCustomerViewModel

其含义是,如果不存在项为AllCustomerViewModel实例的工作区,则为我提供第一个或默认值。

谓词具有如上所述推断的第一个参数,布尔值通过lambda表达式vm=>vm提供的第二个参数为AllCustomerViewModel


这意味着,如果没有工作区,则为我提供第一个或默认值,其中项目是AllCustomerViewModel的实例。

其他人已经回答了问题本身。不过,作为旁白,这段代码会更清楚:

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

既然LINQ已经包含了一个操作符,为什么还要创建自己的操作符呢

其他人自己也回答了这个问题。不过,作为旁白,这段代码会更清楚:

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

既然LINQ已经包含了一个操作符,为什么还要创建自己的操作符呢

谢谢。。你准确地击中了我理解的所有缺口!是否有从工作区推断vm类型的机制的名称?我意识到这种行为一定是C规范给出的,但是它有名字吗?再次感谢。@Bill:这只是类型推断,适用于泛型方法。该功能的技术名称实际上就是类型推断@乔恩:是的,现在我明白了。TSource由调用泛型方法FirstOrDefault的泛型集合工作区的成员类型提供。谢谢。。你准确地击中了我理解的所有缺口!是否有从工作区推断vm类型的机制的名称?我意识到这种行为一定是C规范给出的,但是它有名字吗?再次感谢。@Bill:这只是类型推断,适用于泛型方法。该功能的技术名称实际上就是类型推断@乔恩:是的,现在我明白了。TSource由调用泛型方法FirstOrDefault的泛型集合工作区的成员类型提供。谢谢。。这很有帮助,谢谢。。这很有帮助。