2010-09-20 61 views
1

更新:錯誤報警!錯誤的根源在別處。 (請參見問題的末尾。)Linq搞亂數組的順序?

Linq或foreach是否可能會混淆數組的順序?

我的一位測試人員報告說,他所輸入的項目列表順序與保存在數據庫中的最終列表順序不匹配。更確切地說,第一個元素成爲最後一個元素。

所以我一步一步地檢查了我的代碼,我不知道應該改變順序。有一個Linq查詢和一個foreach循環。這其中的一個可能會搞亂數組的順序嗎?

代碼,簡化了:

List<FooBar> fooBarList = new List<FooBar>(); 

string[][] theData = new string[][] { 
    new string[] { "a", "x" }, 
    new string[] { "b", "y" }, 
    new string[] { "c", "z" } }; 

FooBar[] fooBarArray = theData.Select(
    row => new FooBar { Foo = row[0], Bar = row[1] } 
    ).ToArray(); 

foreach (FooBar item in fooBarArray) 
{ 
    int iRank = fooBarList.Count + 1; 
    item.Ranking = iRank; 
    fooBarList.Add(item); 
} 

theData的陣列的陣列是在作爲輸入給出的事實。它被轉換成一系列業務對象。然後將它們添加到列表中並分配排名字段。該字段與「Foo」和「Bar」一起被寫入數據庫。

將該列表保存在數據庫中後,在該特定情況下,「a」的等級爲3。但對我來說,我無法重現的錯誤行爲...

更新:我錯了,寫入到數據庫中的數據是正確的我看到的數據來自複製從一個業務對象。複製時,訂單在從數據庫中讀取時被混淆,然後這個錯誤的訂單被保存在對象的副本中...... =>接受Jon的回答說「LINQ to Objects通常具有可預測的排序 - 其他供應商經常別。」

+0

我最好的猜測是,當你將它轉換爲數組時,發生了什麼事情,你現在可以用列表來代替嗎? – Gage 2010-09-20 15:41:03

回答

3

那麼,你的示例代碼只顯示LINQ到對象。你如何將數據插入數據庫?如果這也使用LINQ,我強烈懷疑是LINQ to SQL(或其他)導致的問題,而不是LINQ to Objects。

對象的LINQ通常具有可預測的排序 - 其他提供者通常不會。

編輯:如果這種情況可重複發生,那麼你應該能夠捕捉到它發生在調試器...應該給你一些提示。我懷疑如果你試圖創建一個簡短但完整的程序來演示問題,那麼你最終會發現哪裏出了問題。

+0

我使用NHibernate進行O/R映射。然而,「排名」字段是一個正常的整數字段:我是分配數字的人。 NHibernate只是將數字保存在數據庫中。我可以在數據庫中看到「a」的排名爲3,這意味着在排序分配時訂單必須已經更改。 – chiccodoro 2010-09-20 13:31:24

+0

@chiccodoro:在這種情況下,它不應該發生......你並沒有使用Parallel LINQ,對嗎? – 2010-09-20 13:33:47

+0

不是我所知道的(我將如何看待?我只有一個導入System.Linq和OP中列出的語句),而且我也找不到任何潛在的競爭條件來源。 – chiccodoro 2010-09-20 13:37:58