更新:误报!错误的根源在别处。 (请参阅问题的最后部分。)
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。然而,对我来说,我无法重现不良行为......
更新:我错了,写入数据库的数据正确。我查看的数据来自复制的业务对象从原来的那个。复制时,订单在从数据库中读取时混淆了,然后在对象的副本中保留了错误的订单... =&gt;接受Jon的回答说“LINQ to Objects通常具有可预测的排序 - 其他提供商通常不会。”
答案 0 :(得分:3)
好吧,您的示例代码仅显示LINQ to Objects。你是如何将数据插入数据库的?如果那也在使用LINQ,我强烈怀疑它是导致问题的LINQ to SQL(或其他)方面,而不是LINQ to Objects。
LINQ to Objects通常具有可预测的排序 - 其他提供商通常没有。
编辑:如果这种情况可重复发生,那么你应该能够在调试器中发现它......应该给你一些提示。我怀疑如果你试图创建一个简短但完整的程序来证明这个问题,你最终会发现什么是错的。