我试图按分割后的值排序列表。
例如,我的数据看起来像这样。
Z|2
A|1
我希望我的列表按分割后的值排序
所以我会得到
A|1
Z|2
这是我正在使用的,但我收到了错误:
{"输入字符串的格式不正确。"}
All = All.OrderBy(s => int.Parse(s.Split('|')[1])).ToList();
任何帮助都会很棒!谢谢!
答案 0 :(得分:5)
这样可行:
All = All.OrderBy(s => int.Parse(s.Split('|').Last())).ToList();
虽然可以使用结构化类型的列表而不是哑字符串列表,但效果会更好。例如,您可以拥有Tuple<string, int>
的列表,只需按第二个成员对其进行排序即可。您还可以将元组放入有序容器中并自动完成排序。
答案 1 :(得分:1)
您需要先跳过无效格式,假设置于顶部:
All = All.OrderBy(s => {
var parts = s.Split('|');
if (parts.Length != 2)
return int.MinValue;
int value;
if (int.TryParse(parts[1], out value))
return value;
return int.MinValue;
});
答案 2 :(得分:1)
如果您有不确定的值,可以使用TryParse
。这将在列表中放置任何无法解析的值:
All = All.OrderBy(s => {
int value;
if (!Int32.TryParse(s.Split('|')[1], out value)) {
value = Int32.MaxValue;
}
return value;
}).ToList();
(注意:最大可能的int值用于将这些项目放在列表的最后,如果您有任何其他值为2147483648的项目,它们将与那些项目混合。对于也适用于该值的解决方案,您需要创建一个比较器,而不是仅仅从字符串中提取值的委托。)
答案 3 :(得分:0)
您的代码很好 - 您必须拥有一些无效数据。仔细检查初始列表中的值,以确保在管道之后没有任何非数字值,或其他任何类似值。
修改强>
您可以随时捕获错误并以不同方式处理错误,例如:
// This would put all failures at the top of the list
All = All.OrderBy(s => {
try { return int.Parse(s.Split('|')[1]); }
catch { return 0; }
}).ToList();