C#列表<;字符串>;按订单拆分
我正试图根据拆分后的值对列表进行排序 例如,我的数据如下所示C#列表<;字符串>;按订单拆分,c#,list,C#,List,我正试图根据拆分后的值对列表进行排序 例如,我的数据如下所示 Z|2 A|1 我希望列表按拆分后的值排序 所以我会 A|1 Z|2 这是我正在使用的,但我得到了一个错误: {“输入字符串的格式不正确。”} All=All.OrderBy(s=>int.Parse(s.Split(“|”)[1]).ToList() 任何帮助都会很棒!谢谢 您需要先跳过无效格式,假设放在顶部: All = All.OrderBy(s => { var parts = s.Split('
Z|2
A|1
我希望列表按拆分后的值排序
所以我会
A|1
Z|2
这是我正在使用的,但我得到了一个错误:
{“输入字符串的格式不正确。”}
All=All.OrderBy(s=>int.Parse(s.Split(“|”)[1]).ToList()代码>
任何帮助都会很棒!谢谢 您需要先跳过无效格式,假设放在顶部:
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;
});
这将有助于:
All = All.OrderBy(s => int.Parse(s.Split('|').Last())).ToList();
但更好的方法是使用结构化类型的列表,而不是哑字符串列表。例如,您可以有一个元组的列表
,只需按第二个成员对其排序即可。您还可以将元组放入一个有序容器中,并自动完成排序。您的代码很好-您一定有一些无效数据。仔细检查初始列表中的值,以确保管道后面没有任何非数值或类似的值
编辑
您可以随时捕获错误并以不同的方式处理它们,例如:
// 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();
如果有不确定的值,可以使用TryParse
。这会将无法解析的任何值放在列表的最后:
All = All.OrderBy(s => {
int value;
if (!Int32.TryParse(s.Split('|')[1], out value)) {
value = Int32.MaxValue;
}
return value;
}).ToList();
(注意:最大可能的int值用于将这些项放在列表的最后,如果您有任何其他值为2147483648的项,则它们将与这些项混合。对于也使用这些值的解决方案,您需要创建一个比较器,而不是仅从字符串中提取值的委托。)这条规则没有例外吗?例如,是否有任何输入看起来像B |
或C | X
或[第二个点中的任何非数字内容]?@KirkWoll:没错;编辑以修正答案。但是坦率地说,我打算把重点放在“更好”的部分。@IlyaIvanov:我确实发现它比[1]
--在一般情况下当然不一样,但仍然是。@AnthonyPegram或者可能是一堆与问题无关的文本。
@Mike:嗯,这些简单的.NET方法要么有缺陷,要么数据与您显示的不完全一致。你会把钱放在哪里?有些项目不符合您的描述(可能有额外的空白?),请查找它们。我同意Jon的看法@Mike,使用Ctrl+Alt+E在异常情况下中断。当它中断时,请检查应该在调试器中仍然可见的输入。Joe-知道所有数据至少包含一个|不仅仅是管道-错误似乎是管道后面有无效数据,如X | X
,这将导致int.Parse
失败。您的拆分似乎还可以-如果管道丢失,您将得到一个索引,我相信是异常的。如果我要走这条路,我想看看像Guffa这样使用非异常代码的答案。除此之外,如果我期望无效输入,我将捕获与该期望匹配的异常,而不是所有异常。但老实说,我认为OP的第一步是验证他的输入。显然,有些东西不符合他的期望。也许排序应该失败。您认为您的方法适用于A | B1
?如果试图处理非数字秒输入的特殊情况,它可能会比这更健壮。@AnthonyPegram:more constraintOK,那么Xbox | 360
呢。我可能错了,但我不认为他的输入都是一个字母栏一个数字,而是文本栏的数字。@AnthonyPegram:再次编辑我的答案。看起来好多了。接近于Guffa的,但是您有更多的代码来处理甚至不拆分的行。您的最后一行文本现在已过时。