字符串列表基于整数顺序排序

时间:2011-07-31 14:25:16

标签: c# .net asp.net

我有名单。仅当数据类型为字符串时,此列表才包含整数值。我想根据项目的整数顺序对列表进行排序。

我如何实现它?

List<string> newZipCodesList = new List<string>();

6 个答案:

答案 0 :(得分:2)

如果您需要按Integer订购。

List<string> sortedZipCodes = (from code in newZipCodesList
                               orderby Convert.ToInt32(code)
                               select code).ToList();

答案 1 :(得分:2)

我不知道你为什么首先使用List<string>,但无论如何你可以将列表复制到int列表,对其进行排序然后复制回字符串,或者通过强制转换每个比较器对字符串进行排序to int比较它,或者你可以使用API​​来用数字值对字符串进行排序,但是在这里你可以只使用数字:

[DllImport("shlwapi.dll", CharSet = CharSet.Unicode, ExactSpelling = true)]
private static extern int StrCmpLogicalW(String x, String y);

这样:

newZipCodesList.Sort(StrCmpLogicalW);

//测试:

List<string> list = new List<string>(new string[] { "1", "4", "17", "5", "112", "0" });

list.Sort(StrCmpLogicalW);

//results: 0, 1, 4, 5, 17, 112

答案 2 :(得分:2)

您可以使用IComparer Interface实现自己的排序。您将必须创建一个将实现T的IComparer的类,其中T在这种情况下将是字符串。

   newZipCodesList.Sort(new Test());

   public class Test : IComparer<string>
    {
        public int Compare(string x, string y)
        {
            //return 1 when first is greater than second
            if(Convert.ToInt32(x) > Convert.ToInt32(y))
                return 1;
            //return -1 when first is less than second
            else if (Convert.ToInt32(x) < Convert.ToInt32(y))
                return -1;
            //return 0 if they are equal
            else
                return 0;
        }
    }

答案 3 :(得分:2)

如果可以安全地假设列表中的所有元素长度相同(例如邮政编码通常为5个字符),则无需在每个单元上调用Int.Parse()Convert.ToInt()排序前的项目。即使它们被表示为字符串,“字母”排序仍应按数字顺序排列,因为“0”在“1”之前出现在“2”之前......并且比执行所有转换更快。

在这种情况下,这可行:

List<String> zipCodes = new List<String>();
zipCodes.Add("00124");
zipCodes.Add("00123");
zipCodes.Add("98765");
zipCodes.Add("12345");
zipCodes.Add("33333");
zipCodes.Add("24680");

// zipCodes = zipCodes.Select(z => z.PadLeft(5, '0')).ToList();
zipCodes.Sort();

for(int i = 0; i < zipCodes.Count; i++)
   Console.WriteLine(zipCodes[i]);

这是输出:

00123
00124
12345
24680
33333
98765

如果它们的长度不同,您可能可以填充它们,具体取决于您以后如何使用该列表。 (参见代码中的注释行)。 这会将1之类的内容转换为00001

答案 4 :(得分:0)

newZipCodesList.Sort( (a,b) => { 
                             int a1;
                             int a2;
                             if !(int.TryParse(a,out a1)) return 1;
                             if !(int.TryParse(b,out b1)) return -1;
                             return a1.CompareTo(b1);

}

答案 5 :(得分:0)

如果字符串都是数字,则可以使用其他答案。如果情况并非如此,那么请查看here以进行更复杂的排序。