LINQ - 如何使用 OrderBy EnumValue 对对象列表进行排序,并合并结果集?

3

你好!我想使用LINQ查询一个对象列表,并按枚举值、字符串值排序,然后将其余部分以类似的方式排序合并。作为一个LINQ新手,请温柔点。

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

我创建了一个对象列表,并希望可变地对它们进行排序,使得所有具有 Enum.EnumValue[X] 的项目首先在列表中显示,按名称排序,然后按类似方式排序的所有其他项目(几乎像 SQL 中结果集的 Union)。
//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部分进行不同的排序,但我认为这不是你想问的。 - KM.
2个回答

10

不确定你的意思,但你可以尝试使用这个。

// 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 如果不行,请告诉我,嘿嘿。


1
感谢您的回复。您的编辑证明是正确的,因为false在true之前被评估...您的解决方案非常好,非常感谢! - PortageMonkey
太好了,很高兴听到它奏效了 :) 我将删除编辑并修复代码,使其正确无误 =) - Svish

0
你可以取出第一个列表,然后使用list.AddRange()方法将其添加到一个可枚举对象中。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接