2011-03-19 100 views
1

我有幾個特性:索引集合

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。

任何想法?

謝謝。

+0

MyModel是'struct'還是'class'? – Gabe 2011-03-19 04:34:19

回答

4

它添加索引。問題在於,您正在修改由查詢流出的對象。我猜你隨後正在重新執行查詢,並期望這些突變以某種方式「持久化」到查詢中,其方式將反映在查詢的結果中。 LINQ查詢不會這樣工作:查詢表達式的結果是查詢,而不是查詢的結果。每次枚舉結果時,查詢都會再次運行。在你的情況下,新的MyModel的實例將被重新創建,所以舊的更改將會丟失。

一些可能的解決方法:

  1. 建立每個元素進入查詢本身的適當指標。
  2. 將查詢實現爲集合(例如調用ToList()),然後改變集合的元素。
  3. 對結果序列中的每個元素執行'最終'必要的副作用(您沒有向我們顯示),而不是在循環後重新執行查詢,而是在,foreach循環內執行。
+0

+1非常正確。 – 2011-03-19 04:10:24

+0

ahhhaa !!!我添加了.ToList(),並且確實解決了問題。謝謝。 – frenchie 2011-03-19 04:16:16

0

我不確定你的意思是什麼「不像我認爲它應該添加索引」,但我會指出,有一個選擇擴展方法,可以做你想在一個操作。所以

var Output = .... select new MyModel { ... TheIndex = 0, ...}; 

將成爲

var Output = (....).Select((elem, idx) => new MyModel { ... TheIndex = idx, ... });