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)
我究竟做错了什么?
我究竟做错了什么?
你至少做错了七件事。
首先,您缺少两个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)
| 归档时间: |
|
| 查看次数: |
1201 次 |
| 最近记录: |