【发布时间】:2012-12-03 09:13:29
【问题描述】:
我发现了很多关于此的帖子,但未能将它们与我的案例相匹配。
我的列表中有一些字符串
List<string> list = new List<string>{ "100-1", "100-11", "100-3", "100-20" }
我使用以下代码对从this location挑选的代码进行排序
void Main()
{
string[] things= new string[] { "100-1", "100-11", "100-3", "100-20" };
foreach (var thing in things.OrderBy(x => x, new SemiNumericComparer()))
{
Console.WriteLine(thing);
}
}
public class SemiNumericComparer: IComparer<string>
{
public int Compare(string s1, string s2)
{
if (IsNumeric(s1) && IsNumeric(s2))
{
if (Convert.ToInt32(s1) > Convert.ToInt32(s2)) return 1;
if (Convert.ToInt32(s1) < Convert.ToInt32(s2)) return -1;
if (Convert.ToInt32(s1) == Convert.ToInt32(s2)) return 0;
}
if (IsNumeric(s1) && !IsNumeric(s2))
return -1;
if (!IsNumeric(s1) && IsNumeric(s2))
return 1;
return string.Compare(s1, s2, true);
}
public static bool IsNumeric(object value)
{
try {
int i = Convert.ToInt32(value.ToString());
return true;
}
catch (FormatException) {
return false;
}
}
}
我的输出是100-1, 100-11, 100-20, 100-3
我相信它会将- 视为decimal 并比较这些值。其实我期待的结果是
100-1, 100-3, 100-11, 100-20。
我只是想知道它实际上是在什么基础上进行排序的。任何帮助表示赞赏。即使我希望它以不同的方式对待100-2 和100-20。
只是在运行中,我在 Infragistic 控制网格中看到,在其中排序会产生与我在这里预期的结果相同的结果。
编辑
我在列表中还有许多其他字符串值,有些是整数、双精度值等等。连字符只是这里提到的一个案例。
【问题讨论】:
-
如果列表中的某些元素是数字(不带破折号),您将为每个元素调用两次
Convert.ToInt32。而且使用try-catch并不是最好的选择。请改用int.TryParse方法。它会检查它是否是一个数字,和在一次操作中给你这个数字。而且您不需要捕获异常。并且您可以指定s1和s2必须遵守的一些“数字样式”才能成为“好”整数。 -
它将它们排序为字符串。想象一下,如果字母的数字:1 => a; 3=> c;和 11 => aa。然后它将排序为 a, aa, c 而不是 a, c, aa。您必须在比较器中将带有连字符或任何其他分隔符的字符串视为特殊情况才能获得所需的结果。
标签: c# sorting compare hyphen string-comparison