我有几个属性:
MyModel{
public int var1 {get;set;}
public int var2 {get;set;}
public int TheIndex {get;set;}
}
我使用这个模型来填充列表:
var Output = .... select new MyModel {... TheIndex = 0, ...};
然后,我想用以下内容填充每个元素的索引:
int index = 0;
foreach (var a in Output) { a.TheIndex = index++; }
但是,我很困惑为什么它没有像我认为的那样添加索引。相反,它在整个集合中停留在 0。
有什么想法吗?
谢谢。
最佳答案
正在添加索引。问题是您正在改变通过查询 流出的对象。我猜您随后会重新执行查询并期望这些突变以某种方式“持久化”到查询中,其方式将反射(reflect)在查询的新结果中。 LINQ 查询不是这样工作的:查询表达式的结果是一个查询,而不是查询的结果。每次枚举结果时,查询都会再次运行。在您的情况下,将再次创建 MyModel
的新实例,因此对旧实例执行的更改将丢失。
一些可能的修复:
- 为查询本身中的每个元素构建适当的索引。
- 将查询具体化为一个集合(例如使用
ToList()
调用),然后改变集合的元素。 - 在 inside
foreach
循环中对结果序列的每个元素执行“最终”必要的副作用(您没有向我们展示),而不是通过循环后重新执行查询。
关于c# - 索引集合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5359970/