【问题标题】:Sorting IEnumerable<string> [duplicate]排序 IEnumerable<string> [重复]
【发布时间】:2017-12-31 04:26:53
【问题描述】:

我有一个IEnumerable&lt;string&gt;,其值如下:

  • pp
  • pp.10.0
  • pp.6.0
  • pp.6.1
  • pp.8.3
  • kp.10.1
  • kp
  • kp.3.20

...等

我想按字母顺序组织它们,但将具有两位数的值(例如上面的 10.0 和 10.1 的值)保持在具有单个数字的值之下。换句话说,排序后应该是这样的:

  • kp
  • kp.3.20
  • kp.10.1
  • pp
  • pp.6.0
  • pp.6.1
  • pp.8.3
  • pp.10.0

我尝试了一个简单的IEnumerable&lt;string&gt;.OrderBy(x =&gt; x, StringComparer.CurrentCultureIgnoreCase),但在这种情况下不太奏效。

另外请记住,如果您正在考虑拆分字符串,ppkp 部分也可以包含点。

【问题讨论】:

  • 我确实在考虑拆分字符串,你也应该这样做。如果这些部分也有点,请提供更多示例。一般的想法是,您希望通过某种new { key1 = ... , key2 = ..., value = s } 类型进行排序,该类型提供了一个确实具有简单字典顺序的复合键。
  • “另外请记住,如果您正在考虑拆分字符串,pp 和 kp 部分中也可能包含点”。在这种情况下应该如何排序?我不清楚。
  • 你想要“自然秩序”,比如stackoverflow.com/questions/248603/…
  • 你在这里遇到了困难,因为你试图排序的东西实际上是更复杂的对象,而不仅仅是一个字符串。考虑改用更强类型的对象。
  • @HansKesting 完美运行,将其作为答案,我会将其标记为正确。

标签: c# .net


【解决方案1】:

只需创建自己的比较器并将其传递给 OrderBy 的重载:https://msdn.microsoft.com/de-de/library/bb549422(v=vs.110).aspx

例如:

IEnumerable<string>.OrderBy(x => x, new MyComparer());

您自己的比较器可以是实现接口System.Collections.Generic.IComparer&lt;string&gt; 的类(在上面的示例中我将其命名为MyComparer)。将您的比较逻辑放入方法Compare

class MyComparer : IComparer<string>
{
    public int Compare(string x, string y)
    {
        // your logic here
    }
}

// ...

IEnumerable<string> myListOfStrings = ...;

myListOfStrings.OrderBy(x => x, new MyComparer());

【讨论】:

  • 当然,但是什么我的IComparer 究竟会是什么样子?我的意思是,你用什么逻辑来评估这个具体案例?我知道IComparers,只是在这个特殊情况下苦苦挣扎。
  • 这取决于。如果模式是固定的(只有您提到的那些),您可以使用正则表达式来提取组(开头的字母,如果存在的值)。然后你从左到右比较这些组。对于值,您可以将组字符串转换为整数并将它们进行比较以获得正确的顺序。但我想有很多方法可以做到这一点。只要有创意。 ;)
  • 我的意思是,给我看一些工作代码,我会把它标记为正确的。事实上,你的回答并没有给我任何在我的特殊情况下有效的东西——即使它可能指向正确的方向。
  • 我不想做你的作业。你的问题不是很清楚。下次请更准确。例如。说明排序算法是您的问题,而不是如何使用自定义逻辑对 IEnumerable 进行排序。
猜你喜欢
  • 2010-11-23
  • 1970-01-01
  • 2011-04-07
  • 2018-04-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多