例如,如果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)
为什么不将原始列表与已排序的列表进行比较?
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)