【问题标题】:How to sort List<KeyValuePair<string, string>> by numeric part of values? [duplicate]如何按值的数字部分对 List<KeyValuePair<string, string>> 进行排序? [复制]
【发布时间】:2019-01-10 21:25:56
【问题描述】:
var keyValuePairList = model.someDictionary.ToList();
keyValuePairList .OrderBy(r => r.Value);

问题是按字母数字值排序不正确。

输出:CR1 CR10 CR11 CR2 CR20

预期:CR1 CR2 CR10 CR11 CR20

【问题讨论】:

  • @TetsuyaYamamoto 我看了很多解决方案,包括您上面建议的可能重复项,但在我的情况下,它的 List 使它与众不同。我想不通。
  • @VijayendraShah - 你没有List&lt;key, value&gt;List&lt;string, string&gt;,因为那是不可能的(除了创建你自己的类型......)。你确实(可能)有一个List&lt;KeyValuePair&lt;string, string&gt;&gt;,但这不是重点。为什么不干脆做类似yourDictionary.OrderBy(entry =&gt; MagicMethodThatWorksForLists(entry.Value)) 的事情,其中​​“魔法方法”可能类似于链接线程中的PadNumbers 方法?
  • 您的输入是否总是“CR”后跟一个字符串化整数?如果是这样,请查看@ZevSpitz 的答案。如果不是,则模式是“两个 apha 字符”后跟一个整数,或者可能是“N 个字母字符”后跟一个整数。如果是后两种情况之一,则需要建立排序顺序(先是字母,然后是整数,或相反)。然后您需要找到一种方法来拆分字符串(Regex 可能会这样做)。一旦你这样做了,排序就很容易了。
  • @VijayendraShah - 又是一个问题:您似乎找到了List&lt;string&gt; 的解决方案,是什么让您认为这些相同的解决方案不适用于List&lt;KeyValuePair&lt;string, string&gt;&gt;? (或 Dictionary&lt;string, string&gt; 或基本上 any IEnumerable&lt;KeyValuePair&lt;Whatever, string&gt;&gt;
  • @Corak 谢谢.....我听从了你的建议,填充工作。谢谢!!!!

标签: c# linq


【解决方案1】:

如果每个字符串都以两个字母字符开头,我会使用以下内容:

keyValuePairList.OrderBy(r => int.Parse(r.Value.Substring(2)));

否则,请使用正则表达式,详见this answer

var re = new  Regex(@"\d+$");
keyValuePairList.OrderBy(x => int.Parse(re.Match(x.Value).Value));

【讨论】:

  • 它并不总是 CR,它可能是任何长度的普通字符串或字母数字字符串。
  • @VijayendraShah 将来,这是应该包含在问题中的重要信息。无论如何,关于链接的重复问题,我将您推荐给我的answer
猜你喜欢
  • 2017-09-24
  • 2010-10-17
  • 1970-01-01
  • 1970-01-01
  • 2017-11-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-22
相关资源
最近更新 更多