例如,如果List
包含{1,2,3,4,5}
,则调用Sort()
不会改变任何内容。但如果列表包含{1,2,4,3,5}
,则调用Sort()
将更改订单。
有没有办法知道Sort()
是否有任何改变?该方法返回void
。
P.S。
实际上,我在发布此问题之前对此进行了测试。我们的想法是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);
答案 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是否在第一位。如果是,则不需要分类,因此没有改变;如果它没有排序,你可以对它进行排序,然后你就知道它已经改变了。
有了这个,你就不必创建一个用于以后比较的列表克隆,这样可以节省一些内存。