【问题标题】:OrderBy numbers and ThenBy boolean not working for ListOrderBy 数字和 ThenBy 布尔值不适用于 List
【发布时间】:2018-03-28 00:06:56
【问题描述】:

我有一个对象列表,我试图通过两次迭代对其进行排序。

首先是按对象中的整数字段(即 1-1000)按升序对对象进行排序,然后通过对象中的布尔字段按 true 和 false 的布尔值排序。

我所拥有的是……

    public void updateAdapter()
    {
        List<Object> foobar = db.Get(ObjectID);

        foobar = foobar.OrderBy(s => int.Parse(s.Tag)).ThenByDescending(s => s.Duplicate).ToList();

        adapter = new ListAdapter(this, foobar);
        RunOnUiThread(() => adapter.NotifyDataSetChanged());
        ListView.Adapter = adapter;
    }

我的列表按整数字段 n 升序完美排序,但之后不按真值排序。我希望所有真值在按升序整数字段排序后都位于对象列表的顶部。

示例输入:

Lists of Objects Inputted:
FooBar(11, false),
FooBar(1, false),
FooBar(54, true),
FooBar(34, true)
FooBar(77, false),
FooBar(33, false)

List of Objects Outputted:
FooBar(1, false),
FooBar(11, false),
FooBar(33, false),
FooBar(34, true),
FooBar(54, true),
FooBar(77, false),

任何帮助都会是巨大的帮助。谢谢

【问题讨论】:

  • 您能提供示例输入和输出数据吗?听起来您实际上想firstDuplicate排序,thenTag排序。
  • 当然可以。将添加我得到的和我想要的:)

标签: c# linq sorting


【解决方案1】:

您对 orderby-thenby 所做的事情的理解完全是倒退的。

您错误地认为 orderby 首先按整数对列表进行排序,然后通过布尔属性对列表进行稳定的重新排序。这会将所有真值放在一起,按整数排序,将所有假值放在一起,按整数排序。

这不是它的作用。

orderby 按整数对列表进行排序,然后 thenby 将两条记录排序为相同整数的所有位置取走,并按布尔属性对该子列表进行排序。

这应该符合您的直觉。如果我递给你一堆带有数字和字母的卡片,并说先按数字排序,然后按字母排序,然后我递给你 3A、2B、2A、3B,结果将是 2A、2B、3A、3B,然后不是2A、3A、2B、3B,对吧?

所以你想颠倒你的条款。布尔值的一阶;这将把所有的真假放在一起。然后对integer属性做一个thenby,所有true都按照整数排序,所有false都按照整数排序。

也就是说,LINQ to Objects 中的 orderby 需要以稳定的排序方式实现,所以如果你真的想用困难的方式来做,你可以在 integer 属性上做一个 orderby,然后是 second orderby 在布尔属性上,你会得到正确的结果。但这很浪费,因为它对整个列表进行了两次排序,而不是对整个列表进行一次排序,然后对每个子列表进行排序。对两个半列表进行排序通常比对整个列表进行排序更便宜。

【讨论】:

  • 这真的很丰富!事实上,我确实认为是 OrderBy 和 ThenBy 以我想要的方式订购。我也很欣赏使用 LINQ 进行排序的更好方法。这确实帮助并解决了我的问题:)。谢谢埃里克。
猜你喜欢
  • 2020-06-10
  • 1970-01-01
  • 2017-09-23
  • 2018-02-22
  • 2011-01-17
  • 2014-03-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多