3

我试图在拆分后按值排序列表。

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

Z|2  
A|1

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

所以我会得到

A|1  
Z|2  

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

{“输入字符串的格式不正确。”}

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

任何帮助都是极好的!谢谢!

4

4 回答 4

6

这会起作用:

All = All.OrderBy(s => int.Parse(s.Split('|').Last())).ToList();

更好的方法是使用结构化类型的列表而不是哑字符串列表。例如,您可以有一个列表Tuple<string, int>并简单地按第二个成员对其进行排序。您还可以将元组放入有序容器中并自动完成排序。

于 2013-03-28T14:53:07.663 回答
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;
});
于 2013-03-28T14:51:49.760 回答
1

TryParse如果您有不确定的值,您可以使用。这会将无法解析的任何值放在列表的最后:

All = All.OrderBy(s => {
  int value;
  if (!Int32.TryParse(s.Split('|')[1], out value)) {
    value = Int32.MaxValue;
  }
  return value;
}).ToList();

(注意:最大可能的 int 值用于将这些项目放在列表的最后,如果您有任何其他值为 2147483648 的项目,它们将与这些项目混合。对于也适用于该值的解决方案,您将需要创建一个比较器而不是仅从字符串中提取值的委托。)

于 2013-03-28T15:00:30.460 回答
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();
于 2013-03-28T14:53:34.340 回答