【问题标题】:Sorting an ArrayList对 ArrayList 进行排序
【发布时间】:2011-04-03 14:47:08
【问题描述】:

基于我的previous question,我现在尝试使用相同的方法将它们按以下顺序排列,OrderByDescendingThenBy

原件(可以任意顺序排列):

1:1
0:0
0:1
2:1
1:0
2:0

输出

2:0 
1:0 
0:0 
2:1 
1:1 
0:1

如您所见,a 是descending,b 是ascending。但我仍然没有得到正确的排序。任何想法为什么?谢谢

【问题讨论】:

  • 我会首先在您的第一个问题中接受最有帮助的答案,然后在评论中很好地询问该答案的作者以查看这个新问题。如果此问题与第一个问题密切相关,您可以使用此问题编辑您的第一个问题并删除此问题。
  • 至少引用上一个问题中的相关部分添加一个链接。我们这里不拍续集。
  • 对不起,我还是新手 :) 链接:stackoverflow.com/questions/5527230/…
  • 上一个问题中的解决方案似乎很容易适应您的新排序顺序 - 您尝试过什么?
  • 请使用List<string> 而不是ArrayList

标签: c# linq sorting


【解决方案1】:

想想你会手动做什么:

  1. 首先,您必须按升序对第二部分的值进行排序
  2. 然后您必须对具有相同第二部分的值进行排序,使用第一部分按降序排列

在 LINQ 中翻译的差不多:

var sorted = arrayList
.Cast<string>()
.Select(x => x.Split(':'))
.OrderBy(x => x[1])
.ThenByDescending(x => x[0])
.Select(x => x[0] + ":" + x[1]);

为了更清楚一点,ThenBy/ThenByDescending 方法用于对前面OrderBy/OrderByDescending 中相等的元素进行排序,因此代码:)

【讨论】:

  • 很好的答案,但我要改变的一件事是最后选择聚合。
  • @philip : Aggregate() 类似于Sum(),它将列表转换为单个元素。这里我们需要一个列表,我们只需要将每个元素更改为其他内容(即投影),并且 Select() 是在投影的情况下使用的正确方法:)
  • 我一直用它来连接字符串,即 - .Aggregate((lhs,rhs) => lhs + ":" + rhs)
  • @philip: 哦,你的意思是 inside 选择,即Select(x =&gt; x.Aggregate((l, h) =&gt; l + ":" + h)); 是的,即使我更喜欢string.Join 字符串,你也可以使用它。无论如何,在这种情况下,只有 2 个小字符串,那么简单的连接在 IMO 中更具可读性。
  • @philip:实际上string.Join() 也没有在最后一个字段后添加分隔符。对于字符串连接 Aggregate()string.Join() 给出相同的结果,peraphs string.Join 更好,因为它在后台使用 StringBuilder 使用更少的内存,并且 IMO 更具可读性:)
【解决方案2】:
arrayList.ToList().Select(i => { var split = i.Split(":".ToArray(),2));
                                return new { a = Int32.Parse(split[0]),
                                             b = Int32.Parse(split[1}) }; 
                               })
.OrderByDescending(i => i.a)
.ThenBy(i => i.b)

从您的问题来看,您是否希望颠倒顺序(只需交换它们)。 从那里开始工作,也许会重新加入

.Select(i => String.Format("{0}:{1}", i.a, i.b));

祝你好运

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-11-24
    • 1970-01-01
    • 2016-08-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-06
    相关资源
    最近更新 更多