C# 使用二维对象对ArrayList进行排序

C# 使用二维对象对ArrayList进行排序,c#,sorting,icomparable,C#,Sorting,Icomparable,我有一个ArrayList,其中我存储了10个对象,每个对象有两个随机生成的数字,我想根据对象的Y值对列表进行排序 Random rndm = new Random(); ArrayList CustomList = new ArrayList(); for (int i = 0; i < 10; i++) { Point LP = new Point(rndm.Next(50), rndm.Next(50)); CustomList.Add(LP); } Prin

我有一个ArrayList,其中我存储了10个对象,每个对象有两个随机生成的数字,我想根据对象的Y值对列表进行排序

Random rndm = new Random();
ArrayList CustomList = new ArrayList();

for (int i = 0; i < 10; i++) 
{
    Point LP = new Point(rndm.Next(50), rndm.Next(50));
    CustomList.Add(LP); 
}

PrintList(CustomList);
CustomList.Sort(); 
PrintList(CustomList);
我假设它不起作用,因为排序方法不能处理ArrayList中的二维对象。现在如何使排序方法工作

ArrayList CustomList = new ArrayList();
只是一个一维列表-一个点有两个维度的事实与列表的维度无关。点[][]的二维点阵列如下所示:

row col1  col2  col3
1   Point Point Point
2   Point Point Point
3   Point Point Point
问题是默认情况下Point没有实现IComparable接口。这很有道理——你能告诉我1,3是大于还是小于2,2吗?若按第一个坐标进行比较,它会更小,但若按到原点的距离进行比较,它会更大

现在您已经决定了要使用哪个比较函数,可以创建一个新的PointComparer类:

并将其与

CustomList.Sort(new PointComparer());
只是一个一维列表-一个点有两个维度的事实与列表的维度无关。点[][]的二维点阵列如下所示:

row col1  col2  col3
1   Point Point Point
2   Point Point Point
3   Point Point Point
问题是默认情况下Point没有实现IComparable接口。这很有道理——你能告诉我1,3是大于还是小于2,2吗?若按第一个坐标进行比较,它会更小,但若按到原点的距离进行比较,它会更大

现在您已经决定了要使用哪个比较函数,可以创建一个新的PointComparer类:

并将其与

CustomList.Sort(new PointComparer());

最好的方法是使用List,即使使用ArrayList,也可以使用LINQ:

Random rndm = new Random();
ArrayList CustomList = new ArrayList();

for (int i = 0; i < 10; i++) 
{
  Point LP = new Point(rndm.Next(50), rndm.Next(50));
  CustomList.Add(LP); 
}

var sorted = CustomList.Cast<Point>()
                        .OrderBy(p => p.Y)
                        .ToList();

最好的方法是使用List,即使使用ArrayList,也可以使用LINQ:

Random rndm = new Random();
ArrayList CustomList = new ArrayList();

for (int i = 0; i < 10; i++) 
{
  Point LP = new Point(rndm.Next(50), rndm.Next(50));
  CustomList.Add(LP); 
}

var sorted = CustomList.Cast<Point>()
                        .OrderBy(p => p.Y)
                        .ToList();

原来的海报上写着:

Sort方法引发以下异常:

System.InvalidOperationException: The comparer threw an exception. ---> System.ArgumentException: At least one object must implement IComparable.
System.InvalidOperationException: The comparer threw an exception. --->
   System.ArgumentException: At least one object must implement IComparable.
我假设它不起作用,因为Sort方法不能处理两个 多维数组列表

你对两点感到困惑:

首先,它不起作用,因为异常消息告诉您:Point类没有实现接口IComparable。这意味着您的ArrayList不知道如何比较两点: 点1,2与点2,1相比如何:第一个大于、小于或等于第二个吗

其次,ArrayList只是一个数组,一个对象列表。它本质上是一维的。它是一个可调节的长度,相当于,比如说,对象[]

第三,出于几个原因,您应该避免使用非泛型集合类

它们不是类型安全的,而且 泛型版本更易于使用,因为它们是强类型的:您不必将包含的引用向下转换为正确的类型。 因此,根据点的定义:

您可以这样对ArrayList进行排序:

或者,您可以使用通用集合,更简洁地完成相同的任务:

List<Point> listOfPoints = CreateListOfPoints();
listOfPoints.Sort( (left,right) => left.Y.CompareTo(right.Y) != 0
                                 ? left.Y.CompareTo(right.Y )
                                 : left.X.CompareTo(right.X)
) ;

原来的海报上写着:

Sort方法引发以下异常:

System.InvalidOperationException: The comparer threw an exception. ---> System.ArgumentException: At least one object must implement IComparable.
System.InvalidOperationException: The comparer threw an exception. --->
   System.ArgumentException: At least one object must implement IComparable.
我假设它不起作用,因为Sort方法不能处理两个 多维数组列表

你对两点感到困惑:

首先,它不起作用,因为异常消息告诉您:Point类没有实现接口IComparable。这意味着您的ArrayList不知道如何比较两点: 点1,2与点2,1相比如何:第一个大于、小于或等于第二个吗

其次,ArrayList只是一个数组,一个对象列表。它本质上是一维的。它是一个可调节的长度,相当于,比如说,对象[]

第三,出于几个原因,您应该避免使用非泛型集合类

它们不是类型安全的,而且 泛型版本更易于使用,因为它们是强类型的:您不必将包含的引用向下转换为正确的类型。 因此,根据点的定义:

您可以这样对ArrayList进行排序:

或者,您可以使用通用集合,更简洁地完成相同的任务:

List<Point> listOfPoints = CreateListOfPoints();
listOfPoints.Sort( (left,right) => left.Y.CompareTo(right.Y) != 0
                                 ? left.Y.CompareTo(right.Y )
                                 : left.X.CompareTo(right.X)
) ;

为什么不使用列表而不是ArrayList?您如何期望排序方法知道您希望按Y而不是X排序?使用List和List=List.OrderByt=>t.Y.ToList;。既然有了像List这样的通用集合,你就不应该再使用ArrayList了。为什么不使用List而不是ArrayList呢?你怎么会期望排序方法知道你想按Y而不是X排序呢?使用List和List=List.OrderByt=>t.Y.ToList;。你不应该再使用ArrayList了,现在有了像List这样的好的通用集合。原来的问题没有真正的答案。我已经包括了对问题新版本的回答。return x.Y.Comparey.Y;需要返回x.Y.CompareToy.Y;原来的问题没有可能的真正答案。我已经包括了对问题新版本的回答。return x.Y.Comparey.Y;需要返回x.Y.CompareToy.Y;