【问题标题】:Order list by special enum value in linq在 linq 中按特殊枚举值排序列表
【发布时间】:2017-07-11 13:00:27
【问题描述】:

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

我想记录带有“foo”值的记录在输出的第一个

如何在 c# 和 linq 中做到这一点?

提前致谢

public enum myEnum{
    goo,
    foo,
    boo
}

【问题讨论】:

  • 到目前为止你尝试了什么?
  • 您不应该依赖枚举值的顺序,尤其是在您不手动分配数字的情况下。其他人(或您)稍后可能会认为重新排序这些枚举不应该引起任何副作用,但它会。相反,我还建议使用 Dmitry 的字典。

标签: c# linq enums


【解决方案1】:

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

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

【讨论】:

  • @Tim Schmelter:谢谢,EnumOrder 确实更具可读性
  • @Ali7091:是的,正如问题中所示,foo 应该是第一个(其次是boo,然后是goo)。
  • @Tim Schmelter:非常正确,谢谢,但我宁愿将public 更改为internal(或private
  • 这不适用于 SQL。
【解决方案2】:

下面的代码将按两个属性对yourData 进行排序 - NameOfYourEnumPropertyHereNameOfYourIntPropertyHere。您需要替换为您的属性名称,然后离开。

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

【讨论】:

  • 您会注意到在我发布答案后您更改了问题。在您之前的版本中,枚举条目的顺序是不同的。
  • 是的,我改变了我的枚举顺序,请用这个枚举结构回答
  • @Ali7091 使用您编辑的枚举,您应该使用 Dmitry 的解决方案。
【解决方案3】:

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

 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

【讨论】:

    猜你喜欢
    • 2017-07-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-10
    • 1970-01-01
    • 2013-08-26
    • 1970-01-01
    相关资源
    最近更新 更多