你如何索引到 LINQ 中的 var?

Posted

技术标签:

【中文标题】你如何索引到 LINQ 中的 var?【英文标题】:How do you index into a var in LINQ? 【发布时间】:2010-09-07 21:10:52 【问题描述】:

我正在尝试让以下代码在 LINQPad 中工作,但无法索引到 var。有人知道如何在 LINQ 中对 var 进行索引吗?

string[] sa = "one", "two", "three";
sa[1].Dump();

var va = sa.Select( (a,i) => new Line = a, Index = i);
va[1].Dump();
// Cannot apply indexing with [] to an expression of type 'System.Collections.Generic.IEnumerable<AnonymousType#1>'

【问题讨论】:

【参考方案1】:

正如评论所说,您不能将[] 的索引应用于System.Collections.Generic.IEnumerable&lt;T&gt; 类型的表达式。 IEnumerable 接口仅支持方法GetEnumerator()。但是使用 LINQ,您可以调用扩展方法 ElementAt(int)

【讨论】:

【参考方案2】:

您不能将索引应用于 var,除非它是可索引类型:

//works because under the hood the C# compiler has converted var to string[]
var arrayVar = "one", "two", "three";
arrayVar[1].Dump();

//now let's try
var selectVar = arrayVar.Select( (a,i) => new  Line = a );

//or this (I find this syntax easier, but either works)
var selectVar =
    from s in arrayVar 
    select new  Line = s ;

在这两种情况下,selectVar 实际上是IEnumerable&lt;'a&gt; - 不是索引类型。不过,您可以轻松地将其转换为一个:

//convert it to a List<'a>
var aList = selectVar.ToList();

//convert it to a 'a[]
var anArray = selectVar.ToArray();

//or even a Dictionary<string,'a>
var aDictionary = selectVar.ToDictionary( x => x.Line );

【讨论】:

以上是关于你如何索引到 LINQ 中的 var?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 LINQ 获取索引? [复制]

使用 Linq 从列表中获取所有匹配值的索引

如何使用 LINQ 从列表中选择提供的索引范围内的值

如何在使用 Linq 的 Where 子句之后选择数组索引?

linq+lambda+delegate,从list中查找到满足匹配条件的所有数据索引值

使用 LINQ 排序后获取集合中项目的新索引