用连字符比较字符串

时间:2012-12-03 09:13:30

标签: c# sorting compare hyphen string-comparison

我发现了很多帖子,但未能将它们与我的案例相匹配。

我在列表中有一些字符串

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-2100-20

在飞行中,我已经在Infragistic控制网格中看到,在其中进行排序会产生与我期望的结果相同的结果。

修改

我在列表中有很多其他字符串值,有些是整数,双精度等等。连字号只是这里提到的一个案例。

3 个答案:

答案 0 :(得分:4)

var sorted = things.Select(s => s.Split('-'))
                .OrderBy(x => double.Parse(x[0]))
                .ThenBy(x => double.Parse(x[1]))
                .Select(x=>String.Join("-",x))
                .ToList();

答案 1 :(得分:2)

这应该按预期工作:

string[] things= new string[] { "100-1", "100-11", "100-3", "100-20" };
IEnumerable<string> ordered = things
            .Select(s => new
            {
                str = s,
                firstPart = s.Split('-').ElementAtOrDefault(0),
                secondPart = s.Split('-').ElementAtOrDefault(1)
            })
            .OrderBy(x => int.Parse(x.firstPart))
            .ThenBy(x => int.Parse(x.firstPart))
            .Select(x => x.str);

foreach (string s in ordered)
    Console.WriteLine(s);

虽然它假设您的数据是严格的,否则您可以在int.Parse(x.firstPart)处开启例外情况。

演示http://ideone.com/UJ5Yt4

答案 2 :(得分:1)

如果要按第二个数字(连字符后)对项目进行排序,则需要将字符串解析为数字,然后使用它进行排序。你可以尝试:

string[] things = new string[] { "100-1", "100-11", "100-3", "100-20" };
var test = things.OrderBy(r => int.Parse(r.Split('-')[1])).ToArray();

您当前代码无法正常工作的原因可能是由于它无法将字符串100-解析为整数值而您的函数IsNumeric返回false。