我在一个有序数组上使用LINQ to Objects指令。 我不应该做哪些操作来确保数组的顺序没有改变?
当前回答
如果你正在处理一个数组,听起来像是你在使用LINQ-to-Objects,而不是SQL;你能否证实?大多数LINQ操作不会对任何东西重新排序(输出将与输入的顺序相同)-所以不要应用另一种排序(OrderBy[降序]/ThenBy[降序])。
[编辑:乔恩说得更清楚;LINQ通常创建一个新的序列,而不影响原始数据。
注意,将数据推入Dictionary<,> (ToDictionary)将打乱数据,因为Dictionary不尊重任何特定的排序顺序。
但大多数常见的事情(选择,在哪里,跳过,采取)应该是好的。
其他回答
任何“group by”或“order by”都可能改变顺序。
你是在谈论SQL,还是数组?换句话说,你使用的是LINQ To SQL还是LINQ To对象?
LINQ to Objects操作符实际上并不改变它们的原始数据源——它们构建的序列得到了数据源的有效支持。唯一改变顺序的操作是orderderby / orderbydescent /ThenBy/ thenbydescent——即使这样,这些操作对于相同顺序的元素也是稳定的。当然,许多操作将过滤掉一些元素,但返回的元素将是相同的顺序。
如果转换为不同的数据结构,例如使用ToLookup或ToDictionary,我不相信在这一点上顺序是被保留的——但无论如何,这有点不同。(不过我相信,映射到相同键的值的顺序在查找时是保留的。)
如果你正在处理一个数组,听起来像是你在使用LINQ-to-Objects,而不是SQL;你能否证实?大多数LINQ操作不会对任何东西重新排序(输出将与输入的顺序相同)-所以不要应用另一种排序(OrderBy[降序]/ThenBy[降序])。
[编辑:乔恩说得更清楚;LINQ通常创建一个新的序列,而不影响原始数据。
注意,将数据推入Dictionary<,> (ToDictionary)将打乱数据,因为Dictionary不尊重任何特定的排序顺序。
但大多数常见的事情(选择,在哪里,跳过,采取)应该是好的。
我在一个类似的问题中找到了一个很好的答案,它引用了官方文件。引用一下:
对于可枚举方法(LINQ to Objects,适用于List<T>),您可以依赖于Select、Where或GroupBy返回的元素顺序。对于像ToDictionary或Distinct这样固有无序的对象则不是这样。
可列举的。GroupBy文档: 根据源中产生每个IGrouping<TKey, TElement>的第一个键的元素的顺序,生成IGrouping<TKey, TElement>对象。分组中的元素是按照它们在源代码中出现的顺序生成的。
对于IQueryable扩展方法(其他LINQ提供程序)则不一定如此。
来源:LINQ的可枚举方法是否保持元素的相对顺序?
这里的问题特别指的是LINQ-to-Objects。
如果你使用LINQ-to-SQL而不是没有秩序,除非你强加一个像这样的东西:
mysqlresult.OrderBy(e=>e.SomeColumn)
如果不对LINQ-to-SQL执行此操作,则后续查询的结果顺序可能会不同,即使是相同的数据,这可能会导致间歇性错误。
推荐文章
- HTTP POST返回错误:417“期望失败。”
- 如何在。net中创建和使用资源
- 为什么Path。以Path.DirectorySeparatorChar开头的文件名合并不正确?
- 如何在c#中获得正确的时间戳
- 如何读一个文本文件到一个列表或数组与Python
- Linq选择列表中存在的对象(A,B,C)
- c# .NET中的App.config是什么?如何使用它?
- 如何在Python中将十六进制字符串转换为字节?
- set()是如何实现的?
- c#:如何获得一个字符串的第一个字符?
- String类中的什么方法只返回前N个字符?
- 更好的方法将对象转换为int类型
- 我可以将c#字符串值转换为转义字符串文字吗?
- 在c#中转换char到int
- c#中朋友的对等物是什么?