知道在调用List.Sort()后是否更改了订单?

时间:2017-02-10 14:36:18

标签: c#

例如,如果List包含{1,2,3,4,5},则调用Sort()不会改变任何内容。但如果列表包含{1,2,4,3,5},则调用Sort()将更改订单。

有没有办法知道Sort()是否有任何改变?该方法返回void

P.S。 实际上,我在发布此问题之前对此进行了测试。我们的想法是xy之前的项目,因此如果需要返回负值,则会发生交换。不幸的是,它不起作用......但为什么呢?

class IntComp : IComparer<int>
{
    public int Compare(int x, int y)
    {
        var result = x - y;
        if (result < 0)
            _IsChanged = true;
        return result;
    }

    private bool _IsChanged = false;
    public bool IsChanged()
    {
        var result = _IsChanged;
        _IsChanged = false;
        return result;
    }
}

var list = new List<int>() {};
Random r = new Random();
for (int i = 0; i < 1000; i++)
{
    list.Add(r.Next());
}

var comparer = new IntComp();
Stopwatch w = new Stopwatch();
w.Start();
list.Sort(comparer);
w.Stop();
Debug.WriteLine(comparer.IsChanged() + ", " + w.Elapsed);
w.Restart();
list.Sort(comparer);
w.Stop();
Debug.WriteLine(comparer.IsChanged() + ", " + w.Elapsed);

2 个答案:

答案 0 :(得分:9)

为什么不将原始列表与已排序的列表进行比较?

var tmp = new List<MyType>(myList);
list.Sort();

if(tmp.SequenceEquals(list))
{
    // both lists are equals so your list wasn´t modified by Sort
}

SequenceEquals会检查您的两个列表在完全相同的订单中是否具有相同的元素。

编辑:您还可以编写一个简单的方法来迭代您的列表,并检查所有元素是否都超过了它们的祖先。这应该是禁食方式,避免不必要的迭代和列表副本:

public bool IsOrdered<T>(this IEnumerable<T> src) where T: IComparable
{
    for(int i = 1; i < myList.Count; i++)
    {
        if(myList[i - 1].CompareTo(myList[i]) == 1) return false;
    }
    return true;
}

答案 1 :(得分:6)

如果您只想将原始列表保留在内存中,您可以首先检查列表is sorted是否在第一位。如果是,则不需要分类,因此没有改变;如果它没有排序,你可以对它进行排序,然后你就知道它已经改变了。

有了这个,你就不必创建一个用于以后比较的列表克隆,这样可以节省一些内存。