我有一系列动作,包括启用或禁用,其值为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进行排序,但它实际上将它们放在列表的底部。多数民众赞成我想要的,但为什么是这样做的?
答案 0 :(得分:1)
订购
Enable + false => false
Disable + false => false
Enable + true => true
Disable + false => true
当排序布尔值时, false出现在true之前,结果是正确的。
可能是因为0 < 1
(嗯,至少是它的实施方式)?
如果你想要真实的话,可以使用OrderByDescending
(但那不是你想要的)。
但是使用您的代码,您无法确保
之间的顺序Enable true
和
Disable false
例如。