c# - OrderBy 数字和 ThenBy bool 值不适用于 List

标签 c# linq sorting

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

第一种是按对象中的整数字段(即 1-1000)按升序对对象进行排序,然后按对象中的 bool 字段按 true 和 false 的 bool 值排序。

我有的是...

    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),

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

最佳答案

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

您错误地认为 orderby 首先按整数对列表进行排序,然后按 bool 属性对列表进行稳定的重新排序。这会将所有正确的放在一起,按整数排序,并将所有错误放在一起,按整数排序。

这不是它的作用。

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

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

所以你想撤销你的子句。 bool 值的一阶;这将把所有的真假放在一起。然后在integer属性上做一个thenby,所有true按整数排序,所有false按整数排序。

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

关于c# - OrderBy 数字和 ThenBy bool 值不适用于 List,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49517159/

相关文章:

c# - 在字符串中搜索多个字符串

c# - 在sql server中获取最后100条插入的记录

c# - 从 LINQ 实体中的日期时间获取可排序字符串的正确方法是什么?

python - 按长度和最后 N 个字符对字符串列表进行排序

c# - 是否可以通过编程方式检查 selenium Remote Webdriver Server 是否正在运行

c# - 第一页显示最后 10 行,下一页显示最后 10 行

c# - 如何制作一个控制台应用程序,让我输入 LINQ 表达式,然后我的程序将执行它们?

mysql - 如何在 SQL 中按汇总分数对团队进行排序? (两列用 SUM() 排序)

java - 如何从父类(super class)调用抽象方法(在子类中重写)?

c# - LINQ语句优化