【问题标题】:Trouble ordering a collection of objects by a numeric string value property无法按数字字符串值属性对对象集合进行排序
【发布时间】:2013-01-09 21:54:11
【问题描述】:

所以我有一个包含名为 myNumber 的属性的类。它看起来像这样:

public class MyThing
{
    public int name{ get; set; }
    public string myNumber{ get; set; }
}

myNumber 中包含的值可能类似于12-2412-024

我想按 myNumber 降序订购这些对象 (IEnumerable<MyThing> myCollection) 的集合,但我不知道该怎么做。

我试过myCollection.OrderByDescending(f => f.myNumber),但它并不完全符合我的预期。我希望12-22, 13-01, 12-030 像这样订购:

13-01 
12-030
12-22

【问题讨论】:

  • 你的意思是从字符串的前两个字符开始按数字排序吗?还是模式比这更复杂?
  • 为什么 12-030 大于 12-22?
  • 您需要更明确地了解您的规则是什么,这些规则应该如何排序。它们是否应该按数字顺序排列,就好像没有 - 一样?
  • 我猜排序应该首先按左侧的数字对数字进行分组,然后按降序排列。在那之后,他们应该按右侧的数字降序排列“在分组内”。
  • 你期望的顺序不是我期望的。从字符串的角度来看,我希望顺序为 13-01、13-22、12-030(降序)

标签: c# asp.net c#-4.0 collections


【解决方案1】:

您可以像Version 一样订购它。因此,您可以按'-' 拆分并将第一部分用作主要版本,将最后一部分用作次要版本:

var orderedLikeVersion = myCollection
    .Select(t => new
    {
        Thing = t,
        Parts = t.myNumber.Split('-')
    }).Select(x => new
    {
        x.Thing,
        Version = new Version(int.Parse(x.Parts[0]), int.Parse(x.Parts[1]))
    })
    .OrderByDescending(x => x.Version)
    .Select(x => x.Thing);

Demo 得到你想要的结果。

【讨论】:

  • 太棒了。像魅力一样工作。
【解决方案2】:

我猜你收到了这个订单?

13-01 
12-22
12-030

按照字母约定,这将是正确的。 12-2* 大于 12-0*,因为 2 在 0 之后。

它也似乎按照数字约定是正确的,因为 22 也大于 03,并且 2 大于 0。

所以我不确定您的预期顺序,为什么您将 12-030 解释为大于 12-22?连字符后的部分是否应该允许截断前导零?如果你这样做了,那么 12-30 将等于 12-030,我会问自己,前导 0 的目的是什么。

【讨论】:

  • 是的。你是对的。破折号右侧数字的前导零是取消订单的原因。人们可以输入自定义数字,我猜这就是数据以这种方式结束的方式。我想我可以进去尝试清理它,但我担心系统会将 12-030 和 12-30 视为不同的数字,即使它们是相同的。
猜你喜欢
  • 2021-06-27
相关资源
最近更新 更多