【问题标题】:Using an expression lambda on a generic method on a generic collection在泛型集合的泛型方法上使用表达式 lambda
【发布时间】:2011-01-28 16:57:26
【问题描述】:

我正在尝试理解 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 =&gt; vm is AllCustomersViewModel)如何满足FirstOrDefaultsource参数要求?这是否以某种方式暗示?

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

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

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

【问题讨论】:

    标签: c# generics mvvm lambda


    【解决方案1】:
    1. vm 获取其类型,因为Workspaces 是一个包含特定类型的集合。 vm 被自动推断为该类型。

    2. FirstOrDefaultsource 参数是Workspaces. 它是extension method 上的IEnumerable&lt;T&gt;,所以你调用它的实例代替了第一个参数。这就是方法签名中的this 的含义。

    【讨论】:

    • 谢谢你..你准确地击中了我理解中的所有空白!
    • 是否有从 Workspaces 推断 vm 类型的机制的名称?我意识到这种行为一定是 C# 规范给出的,但它有名字吗?再次感谢。
    • @Bill:这只是类型推断,适用于泛型方法。
    • 该功能的技术名称确实只是“类型推断”。 en.wikipedia.org/wiki/Type_inference
    • @Jon:是的,现在我明白了。 TSource 由调用泛型方法 (FirstOrDefault) 的泛型集合 (Workspaces) 的成员类型给出。
    【解决方案2】:

    其他人已经回答了这个问题本身。顺便说一句,这段代码会更清晰:

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

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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

      • 谢谢 .. 这很有帮助。
      猜你喜欢
      • 2023-03-24
      • 2021-02-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-30
      • 1970-01-01
      相关资源
      最近更新 更多