gpt4 book ai didi

c# - 知道调用 List.Sort() 后顺序是否改变了吗?

转载 作者:行者123 更新时间:2023-11-30 18:56:15 25 4
gpt4 key购买 nike

例如,如果一个List包含{1,2,3,4,5},调用Sort()不会改变任何事物。但是,如果列表包含 {1,2,4,3,5},则调用 Sort() 将更改顺序。

有什么方法可以知道 Sort() 是否改变了什么?该方法返回 void

附言实际上,我在发布此问题之前对此进行了测试。这个想法是 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);

最佳答案

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

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;
}

关于c# - 知道调用 List.Sort() 后顺序是否改变了吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42161924/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com