【问题标题】:Linq list orderby multiple lists of specific stringsLinq list orderby 多个特定字符串列表
【发布时间】:2014-04-08 15:54:03
【问题描述】:

我有一个 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()

有什么想法吗?

【问题讨论】:

    标签: c# linq list lambda


    【解决方案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();
    

    【讨论】:

    • 不需要解析和转换。 x =&gt; x.CriteriaOne 就足够了,而且(IMO)非常清楚。
    【解决方案2】:

    是的,它很简单。编写IComparer&lt;string&gt; 的自定义实现,将其初始化并作为LINQ OrderBy() 方法的第二个参数传入,您就可以开始了。

    【讨论】:

      猜你喜欢
      • 2021-07-30
      • 1970-01-01
      • 1970-01-01
      • 2013-05-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多