Linq列表由多个特定字符串列表排序

时间:2014-04-08 15:54:04

标签: c# linq list lambda

我有一个类型为Test的列表

List<Test> testList = new List<Test> 
    { new Test { TestName="gold", CriteriaOne = "sport", CriteriaTwo = "Outdoors" },
    { new Test { TestName="silver", CriteriaOne = "sport", CriteriaTwo = "Indoors" }, 
    { new Test { TestName="bronze", CriteriaOne = "activity", CriteriaTwo = "Water" }, 
    { new Test { TestName="gold", CriteriaOne = "activity", CriteriaTwo = "Outdoors" }, 
                     //some more tests  ...      };

我有一个每个标准的列表

// List of strings to order testListBy first.
List<String> criteriaOneOrder = new List<String> { "sport", "activity", "warmup", "other"};

//List of strings to order testListBy second.
List<String> criteriaTwoOrder = new List<String> { "OutDoors", "Indoors", "Water", "Other"};

我想首先根据criteriaOneOrder列表按类型测试列表排序然后如果两个结果相同,即。不止一项运动然后在第二根绳子上订购它们,以便在室内运动之前列出一项户外运动。

我尝试过使用Lambda表达式,使用OrderyBy函数和IndexOf来尝试重新排序列表但到目前为止还没有成功。

testList = testList.OrderBy(t => criteriaOneOrder.IndexOf(t.CriteriaOne)).ToList()

有什么想法吗?

2 个答案:

答案 0 :(得分:1)

我会使用enumarations来完成此任务:

enum CriteriaOne
{
    sport,
    activity,
    warmup,
    other
}

enum CriteriaTwo
{
    Outdoors,
    Indoors,
    Water,
    Other
}

var orderedList = testList
            .OrderBy(x => Enum.Parse(typeof (CriteriaOne), x.CriteriaOne))
            .ThenBy(x => Enum.Parse(typeof (CriteriaTwo), x.CriteriaTwo))
            .ToList();

如果您将属性的类型更改为枚举,则可以执行以下操作:

var orderedList = testList
            .OrderBy(x => x.CriteriaOne)
            .ThenBy(x => x.CriteriaTwo)
            .ToList();

答案 1 :(得分:0)

是的,它很直白。编写IComparer<string>的自定义实现,初始化它并将其作为LINQ OrderBy()方法的第二个参数传递给你,你就可以了。