在 Linq 查询中用类型名称替换 var

Replacing var with type name in Linq query

我有以下代码:

List<string> myCars = new List<string>()
    { "Mercury Cougar", "Dodge Dart", "Ford Taurus SHO",
      "Dodge Charger", "Chevrolet Blazer", "Dodge Neon" };

    var dodges = from someCars in myCars
                 where someCars.Contains("Dodge")
                 orderby someCars descending
                 select someCars;

Console.WriteLine(dodges.GetType()); //System.Linq.OrderedEnumerable`2[System.String,System.String]

dodges.GetType() returns CIL 语法中的完全限定名称。

如果我将它翻译成 C# 并用它来替换 var,它不会编译:

The type or namespace name 'OrderedEnumerable<,>' does not exist in the namespace 'System.Linq' (are you missing an assembly reference?)

System.Linq.OrderedEnumerable<string, string> dodges = from someCars in myCars
                         where someCars.Contains("Dodge")
                         orderby someCars descending
                         select someCars;

这是因为OrderedEnumerable<string, string>不可用,只有System.Linq.IOrderedEnumerable<string>可用。

为什么 OrderedEnumerable<string, string> 不可用?

Why is OrderedEnumerable<string, string> not available

因为它是接口的 "internal" 实现。没有理由应该提供或记录它。使用 LINQ,您应该针对接口 (IEnumerable<>IOrderedEnumerable<>IQueryable<>...)

进行编程

如果你看一下,所有的 LINQ 方法 return 一个内部 class 派生自其中一个接口,并且通常它们可以 return 多个不同 classes,取决于输入。例如,Enumerable.Select() 可以 return 一个 new SelectListIterator<TSource, TResult> 或一个 SelectIListIterator<TSource, TResult> 或一个 new SelectIPartitionIterator<TSource, TResult> 或其他各种 class,这取决于IEnumerable<>输入。