【问题标题】:Sorting array by item type按项目类型对数组进行排序
【发布时间】:2013-08-13 22:05:44
【问题描述】:

我有一个按类型排序的对象数组。在该数组中是一组已按其首选相对顺序的一种类型的对象。排序后,这些对象被组合在一起,但不再以相同的顺序排列。我正在使用以下排序

Array.Sort(shapes, GetVisualComparer());

我一直在寻找一种承诺保留原始顺序的排序方法,但一无所获。

我会注意到我有一个解决方法,但它给代码增加了不必要的混乱,并且如果将来出现,也不能解决一般问题。

【问题讨论】:

  • " 一种承诺保留原始顺序的排序方法" 嗯? “增加了不必要的混乱”我明白你的意思...请显示示例数据和期望的结果。
  • 您必须向比较器灌输有关这些项目的现有顺序的信息,以便它可以使它们保持相同的顺序。一种解决方法是对除这些项目之外的所有内容进行排序,然后在所需的位置插入预排序的组,但这可能会更笨重。
  • 为什么不先使用'group by',然后对'group by'列表进行排序?
  • 乔恩,我就是这么做的,太丑了。
  • GroupBy 保留顺序,这是有保证的。 “IGrouping 对象的生成顺序基于源中生成每个 IGrouping 的第一个键的元素的顺序。分组中的元素按以下顺序生成产生它们的元素出现在源代码中。”

标签: c# arrays sorting


【解决方案1】:

复制原始数组。然后,让您的比较器比较元素的原始索引(如果它们的类型相同)。

我不知道你的类型排序是基于什么,但按名称排序,它看起来有点像这样:

public class TypeComparer : IComparer<Type>
{
    public int Compare(Type x, Type y)
    {
        int result = StringComparer.InvariantCulture.Compare(x.Name, y.Name);
        if (result == 0)
        {
            result = Array.IndexOf(originalArray, x).CompareTo(Array.IndexOf(originalArray, y));
        }
        return result;
    }
}

【讨论】:

  • 嗯,它看起来不错,但是你最终会在每个等于比较时对数组执行 2 次以上的线性搜索。这可能会完全破坏排序本身的性能......对于一个充满重复的数组,这就像 N^2 加上排序的成本,不是吗?
  • 除非该数组有数百万个条目,否则性能影响可以忽略不计。
【解决方案2】:

问题是Array.Sort&lt;T&gt;(T[], IComparer&lt;T&gt;)is not using a stable sort。

此实现执行不稳定的排序;也就是说,如果两个元素相等,则可能不会保留它们的顺序。相比之下,稳定排序会保留相等元素的顺序。

您必须使用其他方法对数组进行排序。

【讨论】:

  • 谢谢,我不知道稳定排序是我正在寻找的排序类型。这应该有助于我的搜索。
  • stable 不是排序的类型,它是任何/所有排序算法的属性。算法要么稳定,要么不稳定。许多人为了性能而牺牲稳定性,认为如果项目相同,它们的顺序并不重要。
猜你喜欢
  • 2019-05-12
  • 2020-12-05
  • 1970-01-01
  • 2011-11-18
  • 2010-09-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多