2010-09-20 32 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