如何使用多个比较器对列表进行排序

时间:2017-06-18 11:05:29

标签: c# comparison

我有排序问题:

假设我有3个文件,名称如下:

170120_140000_reservation.xml

170120_140001_details_0.xml

170120_140001_details_1.xml

格式为[日期] _ [时间] _ [类型] _ [索引] .xml

(索引不是强制性的)

我需要找到一种按3种条件排序的方法:

  1. 时间戳

  2. 类型(预订>详细信息,这将预先定义为“强”类型)

  3. 索引

  4. 我目前的代码如下:

    List<FileDate> allFilesData = new List<FileDate>();
    //each file is translated into a new "FileDate" object
    allFilesData.Sort((x, y) => DateTime.Compare(x.timeStamp, y.timeStamp));
    

    如果时间戳相等,我如何编写也会知道按类型比较的比较,如果时间戳和类型相等,我怎么写索引?

2 个答案:

答案 0 :(得分:1)

假设您有一个包含datetime typeindex属性的类。然后你可以使用OrderByThenBy运算符LINQ来订购所需的项目:

allFilesData
    .OrderBy(x => x.date)
    .ThenBy(x => x.time)
    .ThenBy(x => x.type)
    .ThenBy(x => x.index);

如果您需要实施特定的比较行为,请查看IComparer Interface

答案 1 :(得分:1)

您可以将更复杂的函数作为lambda传递给比较器,例如:

list of list

(假设类型和索引存储在 1 for i in train_data: ----> 2 train_set[i[-1]].append(i[:-1]) 3 4 for i in test_data: 5 test_set[i[-1]].append(i[:-1]) TypeError: 'int' object is not subscriptable allFilesData.Sort((x, y) => { int c = DateTime.Compare(x.timeStamp, y.timeStamp); if (c == 0) { c = x.type.Length.CompareTo(y.type.Length); if (c == 0) return x.index.CompareTo(y.index); } return c; }); )和typestring)成员中。