按多个字段对集合进行排序

时间:2013-09-06 07:41:31

标签: c# .net linq sorting

我需要对一个集合进行排序。 例如,我有

Austin 12/3/2012   
Sam 100 12/3/2012   
Sam 200 14/3/2012   
Bubly 300 12/3/2012   
Bubly 300 15/3/2012  
ram 100 13/3/2012 

现在,如果排序顺序是Name,datetime 那么输出应该是

Austin 12/3/2012    
Bubly 12/3/2012   
Bubly 15/3/2012   
ram 13/3/2012    
sam 12/3/2012    
sam 14/3/2012  

如果他的排序顺序是Datetime,那么名称 它应该是

12/3/2012 austin
12/3/2012 bubly
12/3/2012 sam
13/3/2012 ram
14/3/2012 sam
15/3/2012 bubly 

相应的其他项目。我该怎么做呢 ?如何按列的顺序进行排序。

3 个答案:

答案 0 :(得分:6)

使用ThenBy进行进一步排序后,您可以使用Linq函数OrderBy

listOfRecords.OrderBy(p => p.Name).ThenBy(p => p.Date)

答案 1 :(得分:4)

首先创建两个函数:

var SortByDate=(p=>p.Date);
var SortByName=(p=>p.Name);

然后你有一个包含两个

的List
var SortDimensions=new List<object>({SortByDate,SortByName});

然后,如果您想按第一个日期排序,那么您可以这样命名:

myList.OrderBy(SortDimensions[0]).ThenBy(SortDimensions[1]);

现在,这里是一个棘手的部分,如果你想先按名称排序,那么你只需要更改SortDimensionsList中函数的顺序:

SortDimensions.Remove(SortByName);
SortDimensions.Insert(0,SortByName);

这样,相同的OrderBy语句会给你一个不同的结果。

PS。不可否认,这非常接近伪代码,因为您可能必须使用除List<object>以外的其他东西来排序编译器错误,但我现在无法访问IDE,但是精神答案仍然是一样的。创建一个集合,在其中存储委托函数,然后更改集合中的顺序,以使用相同的通用代码实现不同的排序维度。

答案 2 :(得分:0)

我会创建一个类来保存您的信息

public class NameDate
{
    private string name;
    private DateTime date;
    public string Name
    {
        get { return name; }
        set { name = value; }
    }
    public DateTime Date
    {
        get { return date; }
        set { date = value; }
    }
}

然后我会填充List<NameDate>来保存您的商品。完成后,要对项目进行排序,您可以使用LINQ

List<NameDate> someList = new List<NameDate>();
someList = GetNameDateList();
var orderedByNameList = someList.OrderBy(e => e.Name);
var orderedByDateTimeList = someList.OrderBy(e => e.Date);

我希望这会有所帮助。