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的,但是您有更多的代码来处理甚至不拆分的行。您的最后一行文本现在已过时。