Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/54.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# OrderBy数字和ThenBy布尔值不适用于列表_C#_Linq_Sorting - Fatal编程技术网

C# OrderBy数字和ThenBy布尔值不适用于列表

C# OrderBy数字和ThenBy布尔值不适用于列表,c#,linq,sorting,C#,Linq,Sorting,我有一个对象列表,我试图通过两次迭代排序 第一种是通过对象中的整数字段(即1-1000)按升序对对象进行排序,然后通过对象中的布尔字段按真布尔值和假布尔值进行排序 我所拥有的是 public void updateAdapter() { List<Object> foobar = db.Get(ObjectID); foobar = foobar.OrderBy(s => int.Parse(s.Tag)).ThenByDesc

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

第一种是通过对象中的整数字段(即1-1000)按升序对对象进行排序,然后通过对象中的布尔字段按真布尔值和假布尔值进行排序

我所拥有的是

    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;
    }

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

你对orderby thenby所做的事情的理解是完全相反的

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

它不是这样做的

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

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

所以你想撤销你的条款。一阶布尔运算;那将把所有的真与假放在一起。然后对integer属性执行thenby,所有True将按integer排序,所有False将按integer排序


也就是说,LINQ to对象中的orderby需要作为稳定的排序来实现,因此如果您真的想以艰难的方式实现它,您可以对integer属性执行一个orderby,然后对布尔属性执行第二个orderby,您将得到正确的结果。但这是浪费,因为它会对整个列表进行两次排序,而不是对整个列表进行一次排序,然后对每个子列表进行排序。排序两个半列表通常比排序一个整列表便宜

你能提供输入和输出数据的样本吗?听起来你实际上想先按
replicate
排序,然后按
Tag
排序。当然可以。将添加我得到的和我想要的:)这真是信息量大!事实上,我确实认为是OrderBy,然后按我想要的方式点菜。我也很欣赏使用LINQ进行订购的更好方式。这确实帮助并解决了我的问题:)。谢谢你,埃里克。
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),