C# 使用二维对象对ArrayList进行排序
我有一个ArrayList,其中我存储了10个对象,每个对象有两个随机生成的数字,我想根据对象的Y值对列表进行排序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
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;