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

本文关键字:排序 集合 字段 | 更新日期: 2023-09-27 18:30:27

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

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 

现在,如果排序顺序是名称,则日期时间那么输出应该是

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

如果他的排序顺序是日期时间,则名称它应该是

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

因此,对于其他项目。我该怎么做?如何采用列的顺序进行排序。

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

在使用

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

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

像这样:

yourList.OrderBy(o => o.DateTime).ThenBy(o => o.Number);

首先,创建两个函数:

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

然后,例如,您有一个包含两个的列表

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

然后,如果您想按第一个日期排序,请命名:

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

现在,这是棘手的部分,如果您想先按名称排序,那么日期您只需更改 SortDimensionsList 中函数的顺序:

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

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

诚然,这非常接近伪代码,因为您可能必须对 SortDimensions 集合使用除List<object>以外的其他内容以避免编译器错误,但我目前无法访问 IDE,但答案的精神保持不变。创建一个集合,在其中存储委托函数,然后更改集合中的顺序,以使用相同的泛型代码实现不同的排序维度。

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

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

我希望这有所帮助。