C#List <string> OrderBy Split </string>

时间:2013-03-28 14:50:28

标签: c# list

我试图按分割后的值排序列表。

例如,我的数据看起来像这样。

Z|2  
A|1

我希望我的列表按分割后的值排序

所以我会得到

A|1  
Z|2  

这是我正在使用的,但我收到了错误:

  

{&#34;输入字符串的格式不正确。&#34;}

All = All.OrderBy(s => int.Parse(s.Split('|')[1])).ToList();

任何帮助都会很棒!谢谢!

4 个答案:

答案 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();