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

时间:2018-05-21 05:53:09

标签: c# linq var

我有以下代码:

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()以CIL语法返回完全限定名称。

如果我将其翻译为C#并使用它来替换{​​{1}},则不会编译:

  

类型或命名空间名称&#39; OrderedEnumerable&lt;,&gt;&#39;在...中不存在   命名空间&#39; System.Linq&#39; (你错过了一个程序集引用吗?)

var

这是因为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>无效?

1 个答案:

答案 0 :(得分:2)

  

为什么OrderedEnumerable<string, string>无法使用

因为它是界面的“内部”命令。没有理由为什么它应该可用或记录。使用LINQ,您应该针对接口进行编程(IEnumerable<>IOrderedEnumerable<>IQueryable<> ...)

如果你看一下,所有LINQ方法都返回一个从这些接口之一派生的内部类,并且通常它们可以返回多个不同类的实例,具体取决于输入。例如,Enumerable.Select()可以返回new SelectListIterator<TSource, TResult>SelectIListIterator<TSource, TResult>new SelectIPartitionIterator<TSource, TResult>或其他各种类,具体取决于IEnumerable<>输入的类型。