C#列表<string>按顺序排列并拆分。

3
我会尽力帮忙翻译,以下是您需要翻译的内容:

我试图通过拆分后的值来对列表进行排序。

例如,我的数据如下所示。

Z|2  
A|1

我希望我的列表按照分割后的值进行排序,因此我会得到以下结果:
A|1  
Z|2  

这是我正在使用的代码,但是出现了错误:

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

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

希望能得到帮助!谢谢!


有没有例外呢?例如,是否存在任何看起来像 B|C|X 或 [第二个位置上的任何非数字字符] 的输入呢? - Anthony Pegram
4个回答

6
这将有效:
All = All.OrderBy(s => int.Parse(s.Split('|').Last())).ToList();

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


@KirkWoll:没错;已编辑以修正答案。但坦白地说,我打算专注于“更好”的部分。 - Jon
如果它确实是最后一个元素,那么“Last”很有用。他的示例A|1实际上可能是A|1|a|一堆文本|不相关|问题无关 - Anthony Pegram
1
@AnthonyPegram 或者可能 a|一堆文本|与问题无关|A|1 - Ilya Ivanov
2
@Mike:嗯,这些简单的 .NET 方法可能有 bug,也可能数据不完全符合你所展示的。你会把你的钱放在哪里?有一些项目不符合你的描述(或许有额外的空格?),请找出来。 - Jon
1
我同意Jon的观点。@Mike,使用Ctrl+Alt+E来在异常时中断程序。当程序中断时,在调试器中检查仍可见的输入内容。看看它的样子,然后你就应该知道如何解决它了。 - Anthony Pegram
显示剩余5条评论

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;
});

你认为你的方法适用于A|B1吗?如果尝试处理非数字第二个输入的特殊情况,它应该比这更健壮。 - Anthony Pegram
@AnthonyPegram:更多的限制。 - cuongle
好的,那么Xbox|360怎么样?我可能错了,但我认为他的输入不全是期望为一个字母-一个数字,而是文本-横杠-数字 - Anthony Pegram
@AnthonyPegram:请再次编辑我的答案。 - cuongle
好的。看起来更好了。接近Guffa的代码,但你需要处理一些没有分割的行,所以你有更多的代码。你的最后一行文本现在已经过时了。 - Anthony Pegram

1
如果您有一些不确定的值,可以使用TryParse。这会将任何无法解析的值放在列表的最后:
All = All.OrderBy(s => {
  int value;
  if (!Int32.TryParse(s.Split('|')[1], out value)) {
    value = Int32.MaxValue;
  }
  return value;
}).ToList();

(注:如果您有任何其他值为2147483648的项,它们将与这些项混合在一起。为了解决这些值的问题,您需要创建一个比较器,而不是仅从字符串中提取值的委托。)

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

Joe - 知道所有的数据至少包含一个 |。 - user222427
不仅仅是管道的问题 - 错误似乎在于管道后面有无效数据,比如 X|X,这会导致 int.Parse 失败。你的分割似乎没问题 - 如果缺少一个管道,我相信你会得到一个 IndexOutOfRangeException - Joe Enos
1
如果我要采取这种方法,我想看看像Guffa那样使用非异常代码的答案。如果我预计会有无效输入,我将捕获与该预期相匹配的异常,而不是所有异常。但说实话,我认为OP的第一步是验证他的输入。显然,某些内容与他的期望不符。也许排序应该失败。 - Anthony Pegram

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接