【问题标题】:LINQ - Sort List of objects using OrderBy EnumValue, and Union result set?LINQ - 使用按枚举值排序和联合结果集对对象列表进行排序?
【发布时间】:2009-07-16 05:26:11
【问题描述】:

您好!我想使用 LINQ 查询对象列表并按枚举值、字符串值对它们进行排序,然后将列表的其余部分以类似的方式排序 LINQ 新手在这里,所以要温柔。

//CTOR for my class
MyClass(id, "Name Value Here", Enum.EnumValueHere);

我创建了这些对象的列表,并希望对它们进行可变排序,以便所有具有 Enum.EnumValue[X] 的项目首先显示在列表中,按名称排序,然后是所有其他以类似方式排序的项目(almnost就像 SQL 中的结果集联合)

//What I have so far (only sorts the list)
List<MyClass> = (from s in MyClass orderby s.EnumValue, s.NameValue  select s).ToList();

任何大师都可以分享一些 LINQ 魔法吗?

谢谢!

【问题讨论】:

  • SQL 每个查询只允许一个 ORDER BY,因此请考虑对整个集合而不是每个 UNION 部分进行排序。有一些技巧可以对 UNION 的每个部分进行不同的排序,但我认为这不是您要问的。

标签: c# linq linq-to-objects


【解决方案1】:

不确定你的意思,但你能用这样的东西吗?

// Using Color as enum just to make things clearer
class ClassyClass
{
    public string Name {get; private set;}
    public Color Color {get; private set;}
    public ClassyClass(id, string name, Color color) { ... }
}


var orderedList = collectionOfClassyClasses
            .OrderBy(x => x.Color != Color.Red) // False comes before true
            .ThenBy(x => x.Color)
            .ThenBy(x => x.Name)
            .ToList();

如果collectionOfClassyClasses 是某种ClassyClass 对象的集合,那么orderedList 将被排序,这样所有颜色设置为红色的对象将首先出现,按名称排序,然后所有其他对象按颜色排序然后命名。至少我认为它会......还没有测试过:p 如果没有,请告诉我,呵呵。

【讨论】:

  • 感谢您的回复。您的编辑被证明是正确的,因为 false 被评估为 true ...您的解决方案效果很好,非常感谢!
  • 很高兴听到它解决了:) 我将删除编辑并修复代码,以便它是正确的 =)
【解决方案2】:

您可以获取第一个列表并执行 list.AddRange() ,它需要一个 ienumerable。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-09
    • 2021-06-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多