OrderBy数字和ThenBy布尔值不适用于List

Smi*_*Kmc 1 c# linq sorting

我有一个对象列表,我试图通过两次迭代排序.

第一种是按对象中的整数字段按升序排序对象,即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;
    }
Run Code Online (Sandbox Code Playgroud)

我的列表按整数字段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),
Run Code Online (Sandbox Code Playgroud)

任何帮助都将是一个巨大的帮助.谢谢

Eri*_*ert 11

您对orderby-thenby的作用的理解完全是倒退的.

您错误地认为,orderby首先按整数对列表进行排序,然后通过Boolean属性对列表进行稳定的重新排序.这将把所有的真理放在一起,按整数排序,并将所有的假设放在一起,按整数排序.

这不是它的作用.

orderby按整数对列表进行排序,然后thenby将两个记录排序到同一整数的所有位置,并通过Boolean属性对该子列表进行排序.

这应该符合你的直觉.如果我递给你一堆带有数字和字母的卡片,然后用数字然后按字母排序,我给你3A,2B,2A,3B,结果是2A,2B,3A,3B,不是2A,3A,2B,3B,对吗?

所以你想要扭转你的条款.首先是布尔值; 这将把所有的真理和愚蠢放在一起.然后在整数属性上执行thenby,并且所有的trues将按整数排序,并且所有的falses将按整数排序.

也就是说,在LINQ to Objects中的orderby需要实现为一个稳定的排序,所以如果你真的想用硬盘做,你可以在整数属性上做一个orderby然后在Boolean属性上做第二个 orderby,并且你会得到正确的结果.但这样做很浪费,因为它会对整个列表进行两次排序,而不是对整个列表进行一次排序,然后对每个子列表进行排序.排序两个半列表通常比排序整个列表便宜.

  • 这真的很有用!事实上,我确实认为是OrderBy和ThenBy以我想要的方式订购.我也很欣赏使用LINQ进行排序的更好方法.这确实有助于解决我的问题:).谢谢Eric. (2认同)