C#LINQ命令错误?

use*_*593 4 c# linq

我有一个我想订购的对象列表,但我无法弄清楚如何使用LINQ来做,也许我认为LINQ以不同的方式工作.

我可以通过使用示例中的where子句简单地解决问题,但我想了解发生了什么.

任何人都可以解释为什么我不能在"值"变量中得到预期的结果?

谢谢

预期结果

[列表"值"中的对象顺序]:

new MyClass{Ordinal = 1, A = true, B = Status.Released, C = 3}
new MyClass{Ordinal = 0, A = true, B = Status.Released, C = 2}
new MyClass{Ordinal = 4, A = true, B = Status.Skipped, C = 5}
new MyClass{Ordinal = 2, A = true, B = Status.Skipped, C = 4}
new MyClass{Ordinal = 3, A = false, B = Status.Skipped, C = 1}
Run Code Online (Sandbox Code Playgroud)

样品

public class Program
{
    static void Main(string[] args)
    {
        var lst = new List<MyClass>{ 
            new MyClass{Ordinal = 0, A = true, B = Status.Released, C = 2},
            new MyClass{Ordinal = 1, A = true, B = Status.Released, C = 3},
            new MyClass{Ordinal = 2, A = true, B = Status.Skipped, C = 4},
            new MyClass{Ordinal = 3, A = false, B = Status.Skipped, C = 1},
            new MyClass{Ordinal = 4, A = true, B = Status.Skipped, C = 5}
        };


        var workaround = lst.Where(i => i.B != Status.Skipped && i.B != Status.Cancelled)
            .OrderByDescending(i => i.A)
            .ThenByDescending(i => i.C)
            .ToList();

        var values = lst.OrderByDescending(i => i.A)
            .ThenBy(i => i.B == Status.Skipped && i.B == Status.Cancelled)
            .ThenByDescending(i => i.C)
            .ToList();

        /* order of the objects in "values"
            new MyClass{Ordinal = 4, A = true, B = Status.Skipped, C = 5}
            new MyClass{Ordinal = 2, A = true, B = Status.Skipped, C = 4}
            new MyClass{Ordinal = 1, A = true, B = Status.Released, C = 3}
            new MyClass{Ordinal = 0, A = true, B = Status.Released, C = 2}
            new MyClass{Ordinal = 3, A = false, B = Status.Skipped, C = 1}
        */
    }
}

public class MyClass
{
    public int Ordinal { get; set; }

    public bool A { get; set; }
    public Status B { get; set; }
    public int C { get; set; }
}

public enum Status
{
    Unknown,
    Released,
    Cancelled,
    Received,
    Processing,
    Succeeded,
    Failed,
    Skipped
}
Run Code Online (Sandbox Code Playgroud)

Cod*_*dor 5

lambda表达式

i => i.B == Status.Skipped && i.B == Status.Cancelled
Run Code Online (Sandbox Code Playgroud)

其被用于ThenBy函数的每个实例映射MyClassfalse,假设该Status.SkippedStatus.Cancelled是不同的值; 这导致没有有用的排序.也许你的意思是

i => i.B != Status.Skipped && i.B != Status.Cancelled
Run Code Online (Sandbox Code Playgroud)

与状态命令条目Status.SkippedStatus.Cancelled底部.