我有名单。仅当数据类型为字符串时,此列表才包含整数值。我想根据项目的整数顺序对列表进行排序。
我如何实现它?
List<string> newZipCodesList = new List<string>();
答案 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以进行更复杂的排序。