按linq中的特殊枚举值排序

时间:2017-07-11 13:00:27

标签: c# linq

我想根据下面的图片订购我的清单 (第一个字段是int,第二个字段是Enum)

我想要记录“foo”值出现在输出的第一位

我怎么能在c#和linq中做到这一点?

提前致谢

public enum myEnum{
    goo,
    foo,
    boo
}

enter image description here

3 个答案:

答案 0 :(得分:8)

对于任意枚举和排序顺序,例如

  public enum MyEnum {
    boo = -1,
    foo = 3, 
    goo = 154,    
  };

我建议映射

  // we want foo, boo, goo order
  internal static readonly Dictionary<MyEnum, int> enumOrder = 
    new  Dictionary<MyEnum, int>() {
      {MyEnum.foo, 1},
      {MyEnum.boo, 2},
      {MyEnum.goo, 3},
  };

查询:

  var result = source
    .OrderBy(item => enumOrder[item.SecondField]) // map second field on the desired order
    .ThenBy(item => item.FirstField);      

答案 1 :(得分:3)

以下代码会按yourDataNameOfYourEnumPropertyHere两个属性对NameOfYourIntPropertyHere进行排序。您需要替换您的房产名称,然后离开。

var sortedResult = yourData
    .OrderBy(z => z.NameOfYourEnumPropertyHere)
    .ThenBy(z => z.NameOfYourIntPropertyHere).ToList();

答案 2 :(得分:1)

一种更简单的方法是只评估枚举并返回比较值:

 var result = list.OrderBy(item => item.myEnum == myEnum.foo ? 1 : 2)
                  .ThenBy(item => item.myEnum == myEnum.boo ? 1 : 2)
                  .ThenBy(item => item.myEnum == myEnum.goo ? 1 : 2); 

这样,您将不需要额外的变量和更易读的代码。

示例:https://repl.it/repls/CornsilkGiganticDevelopers