C#按特定参数排序对象数组

时间:2013-12-11 19:23:54

标签: c# arrays sorting

我对编程比较陌生。我有一个对象数组,不一定是完整的(可能包括空行)。我想通过其中一个类参数“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); });

问题在于它在到达“空”行时崩溃了。

非常感谢!

6 个答案:

答案 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项保留在数组的末尾。

要按降序排序,只需在最后一行交换xy引用。

答案 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个项目,即使它们中的大多数是空的吗? 我建议检查它背后的逻辑,看看你是否可以阻止它,因为这会占用大量的空间。

否则,有两种可能性:

  1. 在比较函数中检查Obj == null。但如果比较项为空

  2. ,它可能仍会失败
  3. 为您的乐谱创建自定义类并使其具有可比性(检查this link以获取有关如何对数组进行排序的若干示例