我有一个对象列表,我试图按两次迭代排序。
第一个是按对象中的整数字段按升序排序对象,即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),
任何帮助都将是一个巨大的帮助。感谢
答案 0 :(得分:11)
您对orderby-thenby的作用的理解完全是倒退。
您错误地认为,orderby首先按整数对列表进行排序,然后通过Boolean属性对列表进行稳定的重新排序。这将把所有的真理放在一起,按整数排序,并将所有的假设放在一起,按整数排序。
这不是它的作用。
orderby按整数对列表进行排序,然后thenby获取两个记录排序到同一整数的所有位置,并按布尔属性对该子列表进行排序。
这应符合你的直觉。如果我递给你一堆带有数字和字母的卡片,然后用数字然后按字母排序,我给你3A,2B,2A,3B,结果是2A,2B,3A,3B,不是2A,3A,2B,3B,对吗?
所以你要反转你的条款。首先是布尔值;这将把所有的真理和愚蠢放在一起。然后在整数属性上执行thenby,并且所有的trues将按整数排序,并且所有的falses都将按整数排序。
也就是说,LINQ to Objects中的orderby需要实现为一个稳定的排序,所以如果你真的想要这么做,你可以对整数属性进行orderby然后 second < / em> orderby在布尔属性上,你会得到正确的结果。但这样做很浪费,因为它会对整个列表进行两次排序,而不是对整个列表进行一次排序,然后对每个子列表进行排序。排序两个半列表通常比排序整个列表便宜。