我对编程比较陌生。我有一个对象数组,不一定是完整的(可能包括空行)。我想通过其中一个类参数“int moveScore”对其进行排序。 这是我的数组(目前只包含32个条目)
Score[] firstPlyScore = new Score[1000];
我尝试了两件事来进行排序
1 在“Score”类中,我继承了“IComparable”并使用了“CompareTo”方法,如下所示
public int CompareTo(object obj)
{
Score x = (Score)obj;
if (this.moveScore < x.moveScore)
return -1;
if (this.moveScore > x.moveScore)
return 1;
return 0;
}
我用它来调用它;
Array.Sort(firstPlyScore);
问题是它确实排序正确,但在数组的末尾。含义行0-966为“null”,967-999正确排序(967具有最高“int”,999具有最低值)。 有没有办法解决这个问题。
2 我也试过这个
Array.Sort(firstPlyScore, delegate
(Score x, Score y) { return x.moveScore.CompareTo(y.moveScore); });
问题在于它在到达“空”行时崩溃了。
非常感谢!
答案 0 :(得分:5)
默认比较行为是在非null
值之前排序的null
值。如果您想要覆盖此行为,那么您的第二个示例中的自定义Comparison<Score>
将是您的选择。
delegate (Score x, Score y) {
if (x == null)
return y == null ? 0 : 1;
if (y == null)
return -1;
return x.moveScore.CompareTo(y.moveScore);
}
这会将null
项保留在数组的末尾。
要按降序排序,只需在最后一行交换x
和y
引用。
答案 1 :(得分:3)
firstPlyScore = firstPlyScore
.Where(x => x != null)
.OrderByDescending(x => x.moveScore)
.ToArray();
答案 2 :(得分:2)
您可以使用Linq to Entities进行排序,然后转换回数组,它会将数组重新调整为正确的长度,而不会出现空问题
var list = firstPlyScore.OrderByDescending(x => x.MoveScore).ToList();
//here how you can get always 1000 array length as you asked
for (int i = list.Count-1; i < 1000; i++)
{
list.Add(null);
}
firstPlyScore = list.ToArray();
}
答案 3 :(得分:1)
在比较方法的开头
if(obj == null) return 0;
答案 4 :(得分:0)
问题在于它确实排序正确但在结束时 阵列。含义行0-966为“null”,967-999正确排序 (967最高“int”,999最低)。有没有办法解决 此
如果您需要可以更改其大小的内容,那么您正在寻找List<int>
,而不是使用数组。
数组应该用于不要更改的列表(例如棋盘)。
List还为您提供了一个名为Sort的方法。
正如其他人所提到的,您也可以使用LINQ来实现您所寻求的目标。
答案 5 :(得分:0)
你真的需要在列表中保留1000个项目,即使它们中的大多数是空的吗? 我建议检查它背后的逻辑,看看你是否可以阻止它,因为这会占用大量的空间。
否则,有两种可能性:
在比较函数中检查Obj == null。但如果比较项为空
为您的乐谱创建自定义类并使其具有可比性(检查this link以获取有关如何对数组进行排序的若干示例