排序(数组数组,System.Collections.comparer?comparer)-参数还是实现



方法数组。Sort((具有以下签名

public static void Sort (Array array, System.Collections.IComparer? comparer);

看起来您需要传递一个IComparer引用。但真正需要的是数组需要实现IComparable,不是吗?

我第一次看到这种语法。这很常见吗?如何区分实参数?有没有关于这个主题的更多信息(一般(?

重要信息/编辑:ATM我正在读一本C#书,上面写着Sort.Array(从德语翻译成英语(:

在我们的例子中,我们将要排序的数组传递给第一个参数arr。第二个参数的类型为IComparer接口。当然不能将IComparer类型的实例传递给方法调用,因为接口是不可实例化的。这不是类型应当理解第二参数的规范。相反第二个参数只需要将第一个参数传递给它是一个实现接口IComparer的对象-对象的类型为DemoClass、Circle、

基本上,他说第二个参数是对第一个参数的描述。他是对的,还是可能是错的,是我困惑的根源?

https://openbook.rheinwerk-verlag.de/visual_csharp_2012/1997_04_008.html

我刚刚实现了以下片段。这可能是一种传递第二个参数的方法,对吧?

Array.Sort(shapes, (a, b) => {
if (a.GetArea() < b.GetArea()) return -1;
else if (a.GetArea() > b.GetArea()) return 1;
return 0;
});

如果不传递比较器,它将使用Array项的默认比较器实现。但是,如果您有一个特殊的比较器,那么您可以传递自己的自定义比较器来对元素进行排序。

假设你有一个学生类(学生数组(,你默认的学生比较器可以基于总分。然而,数学老师可能只想根据数学成绩对学生进行排序,在这种情况下,数学老师可以编写自己的自定义MathsRankComparer,并将其传递给排序方法,这样他就可以根据数学成绩排序学生。

同样,英语或科学老师可以通过相应的比较器来获得所需的排名/排序/排序。

希望这有助于理解超负荷的使用。

更新:一些例子来了解细节。

public class Student: IComparable<Student>
{
public int ID { get; set; }
public string Name { get; set; }
public float TotalMarks { get; set; }
public float ScienceMarks { get; set; }
public float MathsMarks { get; set; }
public float EnglishMarks { get; set; }
public int CompareTo(Student other)
{
if (this.TotalMarks == other.TotalMarks)
return 0;
if (this.TotalMarks < other.TotalMarks)
return -1;
return 1;
}
}
public class MathsMarksBasedComparer : System.Collections.Generic.IComparer<Student>
{
public int Compare(Student a, Student b)
{
if (a.MathsMarks == b.MathsMarks)
return 0;
if (a.MathsMarks < b.MathsMarks)
return -1;
return 1;
}
}
public class EnglishMarksBasedComparer : System.Collections.Generic.IComparer<Student>
{
public int Compare(Student a, Student b)
{
if (a.EnglishMarks == b.EnglishMarks)
return 0;
if (a.EnglishMarks < b.EnglishMarks)
return -1;
return 1;
}
}

最后,你可以这样使用它们。

Student[] arr = new Student[100]; // Ignore this, you can use other styles of declaration
Array.Sort(arr, new EnglishMarksBasedComparer());
Array.Sort(arr, new MathsMarksBasedComparer());
Array.Sort(arr);

基本上,他说第二个参数是对第一个参数的描述。他是对的,还是可能是错的,是我困惑的根源?

这没有错,只是措辞有点混乱。IComparer是一个可以为null的类型(由IComparer末尾的问号定义(。这表示IComparer是可选的/不必通过。然而,正如Mahesh Bongani在他的回复中已经指出的那样——在内部,如果你不提供比较器,它会使用对象的去替换比较器。

因此,对于这个特定的函数,如果您传递一个带有未实现可比较对象的数组,则函数将无法正确地对元素进行排序。

我见过IComparer几次,不确定是什么标准实现了它——就列表、数组等而言。我知道数字实现了它,我认为字符串也实现了它。您可以自定义实现这个推断面。如果内存对我来说是正确的,它只提供了一个返回int的方法(接口,所以你必须自己编写逻辑(。-1(<0(排名较低,+1(>0(排序较高,0相同。