在 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<>
输入。
我有以下代码:
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<>
输入。