使用LINQ维护订单
我在有序数组上使用LINQ to Objects指令。 我应该做哪些操作来确保数组的顺序没有改变?
我检查了System.Linq.Enumerable的方法,放弃了返回非IEnumerable结果的任何方法。 我检查了每一个的评论,以确定结果的顺序将如何与来源的顺序不同。
完全保留订单。 您可以通过索引将源元素映射到结果元素
保留订单。 元素被过滤,但不被重新排序。
破坏秩序 - 我们不知道按期望结果的顺序。
明确重新定义订单 - 使用这些更改结果的顺序
根据一些规则重新定义订单。
编辑:我已经移动了基于这个实现保持顺序不同。
private static IEnumerable<TSource> DistinctIterator<TSource>
(IEnumerable<TSource> source, IEqualityComparer<TSource> comparer)
{
Set<TSource> set = new Set<TSource>(comparer);
foreach (TSource element in source)
if (set.Add(element)) yield return element;
}
你真的在谈论SQL,还是关于数组? 换句话说,你是使用LINQ to SQL还是LINQ to Objects?
LINQ to Objects运算符实际上并没有改变它们的原始数据源 - 它们构建了由数据源有效支持的序列。 唯一改变顺序的操作是OrderBy / OrderByDescending / ThenBy / ThenByDescending - 即便如此,那些对于同等顺序的元素也是稳定的。 当然,很多操作都会过滤掉一些元素,但是返回的元素将会以相同的顺序排列。
如果你转换为不同的数据结构,例如使用ToLookup或ToDictionary,我不认为顺序在这一点上保留 - 但是这有点不同。 (我相信,虽然映射到同一个键的值的顺序被保留用于查找。)
如果你正在处理一个数组,那听起来你正在使用LINQ到对象,而不是SQL; 你可否确认? 大多数LINQ操作不会重新排序(输出的顺序与输入顺序相同) - 因此不要应用其他排序(OrderBy [Descending] / ThenBy [Descending])。
[编辑:正如Jon所说的更清楚; LINQ通常会创建一个新的序列,只保留原始数据]
请注意,将数据推送到Dictionary<,>
(ToDictionary)将扰乱数据,因为字典不尊重任何特定的排序顺序。
但最常见的事情(选择,地点,跳过,采取)应该没问题。
链接地址: http://www.djcxy.com/p/5849.html