Array.Sort 与自定义 IComparer 接口

bla*_*ord 1 c# sorting arraylist icomparer

我编写了以下实现 IComparer 的类:

class CustomComparer : IComparer<string>
{
    public int Compare(string x, string y)
    {
        int intX;
        int intY;

        if (int.TryParse(x, out intX) && int.TryParse(y, out intY)) //both numbers
        {
            intX.CompareTo(intY);
        }
        else if (!int.TryParse(x, out intX) && !int.TryParse(y, out intY)) //both letters
        {
            x.CompareTo(y);
        }
        else if (!int.TryParse(x, out intX) && int.TryParse(y, out intY)) //first is a letter, second a number
        {
            return -1;
        }
        else if (int.TryParse(x, out intX) && !int.TryParse(y, out intY)) //first is a number, second is a letter
        {
            return 1;
        }

        return 0;
    }
}
Run Code Online (Sandbox Code Playgroud)

我不确定我是否做对了一切,但我目前无法调用它。在我的程序中,我有一个 ArrayList 我试图调用它:

CustomComparer c = new CustomComparer()
myArrayList.Sort(c);
Run Code Online (Sandbox Code Playgroud)

我究竟做错了什么?

Eri*_*ert 5

我究竟做错了什么?

你至少做错了七件事。

首先,您缺少两个return语句。

其次,由于您没有注意到您遗漏了两个return语句,因此您遗漏了会执行这些代码路径的测试用例的可能性很大。

第三,干掉你的代码。不要重复自己。重写此代码,以便您调用int.TryParse两次,而不是八次。

第四,永远不要ArrayList在之后编写的代码中使用,比如说 2005。使用List<string>.

第五,return 0遥不可及。无法访问的代码是一种不好的做法。重写该方法,使每一行都可以访问。

六、ArrayList.Sort不带IComparer<string>

第七,需要比较器来处理空值。明确处理这些情况是个好主意,这样您就不会意外取消引用它们。传统上要走的路是说空值比其他任何东西都小。

第八,虽然返回任何旧数字都没有,但我在编写比较器时总是返回 0、1 或 -1 是我的习惯。

第九,在字符串引用相等的情况下,“提前退出”是一个很好的做法。这种情况非常快,所以如果你能接受,你应该接受。

我倾向于像这样编写这段代码:

static int? MyParse(string s)
{
    int parsed;
    bool isValid = int.TryParse(s, out parsed);
    return isValid ? (int?)parsed : (int?) null;
}
public int Compare(string x, string y)
{
    if (ReferenceEquals(x, y)) return 0;
    if (ReferenceEquals(x, null)) return -1;
    if (ReferenceEquals(y, null)) return 1;

    // We now know that neither is null.

    int? intX = MyParse(x);
    int? intY = MyParse(y);

    if (!intX.HasValue && intY.HasValue) return -1;
    if (intX.HasValue && !intY.HasValue) return 1;

    // We now know that intX.HasValue == intY.HasValue

    int result = intX.HasValue ? intX.Value.CompareTo(intY.Value) : x.CompareTo(y);
    if (result < 0) return -1;
    if (result > 0) return 1;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)