当元组列表排序时,默认行为是什么?

10

我想要对一个包含 Tuple<int, string>List 根据其中的 int 值进行排序。在这个 示例 中,使用了以下代码:

List<Tuple<int, string>> list = new List<Tuple<int, string>>();
list.Add(new Tuple<int, string>(1, "cat"));
list.Add(new Tuple<int, string>(100, "apple"));
list.Add(new Tuple<int, string>(2, "zebra"));

list.Sort((a, b) => a.Item1.CompareTo(b.Item1));

foreach (var element in list)
{
    Console.WriteLine(element);
}

我注意到如果我更改以下那行:

list.Sort((a, b) => a.Item1.CompareTo(b.Item1));

致:

list.Sort();

元素再次排序。

这是否意味着默认行为是使用第一个项目?如果是,这两种技术之间是否有性能差异?


2
List<T>.Sort()方法使用列表中所持对象类型的默认比较器对整个列表中的元素进行排序。 - CodeCaster
1
Tuple<T1, T2>.IComparable.CompareTo 方法 -> 示例说明 .Sort() 是按其第一个组件排序的。 - DJmRek
1
@DJmRek,它说它按所有组件排序;代码中的示例是错误的,因为第一个组件上没有重复项。 - Marc Gravell
1个回答

11
元组通过逐个比较每个组件并使用该组件的默认排序来进行比较。虽然不太清楚,但是(来自MSDN):

“Tuple<T1, T2>.IComparable.CompareTo” 方法使用默认对象比较器来比较每个组件。

这与您的示例略有不同,因为在匹配的情况下(例如,具有 int 值为 7 的 2 个项),排序将继续到元组的第二个、第三个、第四个等组件(在您的情况下为 string)。

为什么首先它说“比较每个组件”,然后示例说“数组已按其第一个组件排序”? - Selman Genç
1
@Selman22 因为没有重复项;尝试对 {1, "c"}, {2, "a"}, {2,"c"}, {1, "a"} 进行排序,以查看它按两个元素排序(输出应为 {1,"a"},{1,"c"},{2,"a"},{2,"c"})。 - Marc Gravell
非常感谢。这非常有趣。我刚刚测试了一下,如果我只使用 sort(),则仅在第一项相等时才比较第二项。但是,如果我使用链接中的代码,则不是这种情况。 - gotqn

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接