【问题标题】:Maintain subsequence order in OrderBy在 OrderBy 中维护子序列顺序
【发布时间】:2013-11-19 00:07:49
【问题描述】:

假设我有一个具有整数 Day 属性和 IEnumerable<T> 对象的类,其中天数为 2、3、4、1、3、3 和 5(按此顺序)。

有没有办法保证子序列的顺序(例如)o.Day == 3 从其元素在原始列表中的相对位置保持不需要显式的自定义实现IEnumerable?

【问题讨论】:

  • 什么子序列?我只看到一个IEnumerable<T> 的对象。
  • @TimSchmelter 我认为 OP 意味着这两个 3 个元素一个接一个。
  • @golergka 完全正确 - 子序列是初始序列的有序子集。

标签: c# sorting ienumerable


【解决方案1】:

OrderBy 被记录为stable,如果这就是你的意思的话;所以:你不需要做任何事情。

Enumerable.OrderBy

此方法执行稳定排序;也就是说,如果两个元素的键相等,则保留元素的顺序。相反,不稳定的排序不会保留具有相同键的元素的顺序。

【讨论】:

  • 完美。这正是我一直在寻找的。谢谢!
【解决方案2】:

有没有办法保证子序列where的顺序

假设你有这样的课程:

class A
{
    public string Name { get; set; }
    public int Day { get; set; }

    // other properties
}

和顺序:

{ "A", 2 },
{ "B", 3 },
{ "C", 4 },
{ "D", 1 },
{ "E", 3 },
{ "F", 3 },
{ "G", 5 },

如果你的意思是,会这样:

sequence.Where(item => item.Day == 3)

生成序列,其中项目将按如下方式排序:B, E, F,然后答案是“不,你不能保证”。

如果您的序列是List<A>,则将保留排序(实际上,它将与 LINQ to Objects 一起保留,而不仅仅是列表)。

如果您的序列是 IQueryable<A>,那么排序可能取决于 LINQ 提供程序实现、底层数据源和当前表达式树,它们已包含在 IQueryable<A> 中。因此,在这种情况下,您应该使用OrderBy/OrderByDescending 强制订购。

【讨论】:

  • 我没有投反对票,但我不同意你的回答。如果sequenceIEnumerable<A>,那么sequence.Where(item => item.Day == 3) 将保留原始顺序。
  • @user2266486:是的,它会的。 If your sequence is a List<A>, than ordering will be preserved - 你读过这个吗?
  • 问题明确指出IEnumerable<T> - 所以这里只有Enumerable(不是Queryable)方法是候选的;另外 - 问题是在谈论OrderBy,而不是Where
  • @MarcGravell:除了标题之外,你在任何地方都看到过OrderBy吗?
  • @Dennis 是的,我做到了。我不同意你之前所说的'答案是'不,你不能保证''。 Morover,序列不需要是List<A>IEnumerable<A> 就足够了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-31
  • 2014-03-03
  • 1970-01-01
  • 1970-01-01
  • 2015-06-27
相关资源
最近更新 更多