多个项目的特定订单

时间:2014-07-02 09:50:34

标签: c# linq

我有一系列动作,包括启用或禁用,其值为true或false。在功能上,Enable:True相当于Disable:False(由于其他遗留原因,存在wo类型。)

我需要将操作列表解析为单个相关操作,其中导致禁用的操作优先。即如果一个动作表明它应该禁用目标,而所有其他动作表明它应该启用它们,则禁用胜利。

我已经提出了以下代码:

void Main()
{
    var actions = GetActions();

    var x = actions.OrderBy(A => (A.ActionType == ActionType.Enable && A.Value)
                                || (A.ActionType == ActionType.Disable && !A.Value)).ToList();

    Console.WriteLine("Initial Order");
    x.Dump();

    x = x.Skip(1).ToList();

    actions.RemoveAll(A => x.Contains(A));

    Console.WriteLine("End Result");
    actions.Dump();
}

private List<Action> GetActions()
{
    var actions = new List<Action>();

    actions.Add(new Action() { ActionType = ActionType.Enable, Value = true });
    actions.Add(new Action() { ActionType = ActionType.Enable, Value = false });
    actions.Add(new Action() { ActionType = ActionType.Disable, Value = true });
    actions.Add(new Action() { ActionType = ActionType.Disable, Value = false });

    return actions;
}

// Define other methods and classes here
public class Action
{
    public ActionType ActionType { get; set; }
    public bool Value { get; set; }
}

public enum ActionType
{
    Enable,
    Disable
}

这给了我我想要的东西(即指示应该发生禁用动作的单个记录)。无论为ActionType枚举值(甚至是枚举文本)设置了什么值,它也都有效。

问题是,我不明白为什么,而且我担心某些事情可能导致它无效。

根据订单:

var x = actions.OrderBy(A => (A.ActionType == ActionType.Enable && A.Value)
                            || (A.ActionType == ActionType.ADisable && !A.Value)).ToList();

    // Order Is:
    // Enable  False
    // Disable True
    // Enable  True
    // Disable False

我原本以为它会在列表的顶部对Enable:True和Disable:False进行排序,但它实际上将它们放在列表的底部。多数民众赞成我想要的,但为什么是这样做的?

1 个答案:

答案 0 :(得分:1)

订购

Enable + false => false

Disable + false => false

Enable + true => true

Disable + false => true

当排序布尔值时, false出现在true之前,结果是正确的。 可能是因为0 < 1(嗯,至少是它的实施方式)?

如果你想要真实的话,可以使用OrderByDescending(但那不是你想要的)。

但是使用您的代码,您无法确保

之间的顺序
Enable true

Disable false

例如。