如何对通用列表中的部分项进行排序

时间:2011-06-27 18:00:21

标签: c# linq list sorting

我有一个List对象,其中包含以下类型的项目

public class Item{

    public int Type; //this can be only 0 or 1
    public string Text;


}

我想首先按类型对整个列表进行排序,然后按文本对类型为1的项目进行另一种排序?

如何实现这一目标?

非常感谢

6 个答案:

答案 0 :(得分:10)

我是这样做的。

var ordered = list.OrderBy(i => i.Type == 0 ? "" : i.Text);

这假设没有空的文本字符串,其中i == 0.如果你不能做出这个假设,那么下面的方法就可以了:

var ordered = list.OrderBy(i => i.Type).ThenBy(i => i.Type == 0 ? "" : i.Text);

通过为所有项目提供0类型相同的值,您将按照初始顺序将它们全部保留,同时按其文本值对其他项目进行排序。

另一方面,这是代码气味:

public int Type; //this can be only 0 or 1

乍一看,听起来应该是布尔值或自定义enum类型。在深入了解你想要做什么之后,如果Type为0,听起来好像你不期望Text甚至是合法的值。如果是这种情况,你应该考虑使用类继承实际上区分一种项目类型。

答案 1 :(得分:2)

你的问题不是很清楚。听起来你想要两种不同的排序,而不是一个字段上的排序,然后在Type等于1时进行稳定的重新排序?

假设前者:

var sortByType = items.OrderBy(x => x.Type)
                      .ToList();
var sortTheOnesByText = items.Where(x => x.Type == 1)
                             .OrderBy(x => x.Text)
                             .ToList();

答案 2 :(得分:1)

List<Item> items;

items = items.OrderBy(i => i.Type).ThenBy(i => i.Type == 1 ? i.Text : null);

答案 3 :(得分:1)

实施IComparable<Item> 通过示例msdn查看详细信息 而不仅仅是使用List<T>.Sort()方法

答案 4 :(得分:0)

如果您不介意订购0型物品,那么您可以

var sortedItems = items.OrderBy(i => i.Type).ThenBy(i => i.Text);

否则,如果您需要保留类型0项目的原始订单,则可以执行

var sortedItems = items.OrderBy(i => i.Type).ThenBy(i => i.Type == 0 ? "A" : i.Text);

答案 5 :(得分:0)

我认为你的意思是你想要将所有类型= 0放在前面,所有类型= 1放在后面,并且还要按类型= 1的文本排序。

items.OrderBy(item => item.Type).ThenBy (item => type == 0 ? "" : item.Text)