我想访问linq查询中的行号。 网上有很多文章说明如何做到这一点,但有一个问题: 我想解决枚举"稍后"我希望它每次都分配相同的ID。 出于这个原因,这样的方法不起作用:
public IEnumerable<MyClass> GetThings(List<object> lst)
{
int ID=0;
return from i in lst
select new MyClass(ID++, i);
}
public class MyClass
{
public MyClass(int ID, object Stuff)
{ ... }
}
...
var x = GetThings(SomeList);
(失败,因为每次通过迭代每个项目解析x获得不同的id)
答案 0 :(得分:1)
原来解决这个问题非常简单 - 获取源集合的行号,而不是输出集合。 显然,这仅在您不进行过滤等时才有效,并且输出集合中的项目数与输入集合相同。除非你没有差距和/或重复
即。
public IEnumerable<MyClass> GetThings(List<object> lst)
{
int ID=0;
return from i in lst.Select((item,id)=>new {Item=item, ID=id})
select new MyClass(i.ID, i.Item);
}
public class MyClass
{
public MyClass(int ID, object Stuff)
{ ... }
}
...
var x = GetThings(SomeList);
现在,每次迭代时,x中每个项目的ID都是相同的
答案 1 :(得分:1)
实际上你也可以使用传递索引的Select
重载,如下所示:
lst.Select((o, i) => new MyClass(i, o));