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

Dam*_*les 2 c#

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

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

PS 实际上,我在发布此问题之前对此进行了测试.这个想法是x以前的项目y,所以如果需要返回负值,则会发生交换.不幸的是,它没有用......但为什么呢?

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);
Run Code Online (Sandbox Code Playgroud)

Him*_*ere 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
}
Run Code Online (Sandbox Code Playgroud)

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;
}
Run Code Online (Sandbox Code Playgroud)

  • @DamnVegetables如果你真的想要一个很好的解决问题的办法,你可以阅读过这个答案. (3认同)

L-F*_*our 6

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

这样,您就不必创建用于以后比较的列表克隆,这样可以节省一些内存.

  • @Fran您不能将列表与任何其他列表进行比较.您可以将列表中的项目相互比较.答案也绝不需要按照链接得到答案; 说这是一个链接只有答案是荒谬的.除了链接之外,答案中有明确的内容. (3认同)
  • 你没有得到任何内存因为*检查列表是否排序*也将通过完全迭代对列表进行排序. (2认同)