在 linq 输出中分配顺序 "row number"
Assinging a sequential "row number" in linq output
我想在 linq 查询中访问行号。
网上有很多文章说明如何执行此操作,但有一个问题:
我想解析枚举 "later" 并且我希望它每次都分配相同的 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)
事实证明这个问题的解决方案非常简单 - 获取源集合的行号,而不是输出集合的行号。
显然,这仅在您不进行过滤等并且输出集合中的项目数与输入集合中的项目数相同时才有效。除非你不介意空格 and/or 重复
即
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 都相同
实际上你也可以使用传递索引的 Select
重载,像这样:
lst.Select((o, i) => new MyClass(i, o));
我想在 linq 查询中访问行号。 网上有很多文章说明如何执行此操作,但有一个问题: 我想解析枚举 "later" 并且我希望它每次都分配相同的 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)
事实证明这个问题的解决方案非常简单 - 获取源集合的行号,而不是输出集合的行号。 显然,这仅在您不进行过滤等并且输出集合中的项目数与输入集合中的项目数相同时才有效。除非你不介意空格 and/or 重复
即
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 都相同
实际上你也可以使用传递索引的 Select
重载,像这样:
lst.Select((o, i) => new MyClass(i, o));