2014-07-02 33 views
0

我有一些操作的集合,這些操作可以是「啓用」或「禁用」,具有指示true或false的值。在功能上,Enable:True等同於Disable:False(因其他遺留原因而存在的窩型)。關於多個項目的具體訂單

我需要將一系列操作解析爲單個相關操作,其中導致禁用的操作優先。即如果一個動作指示它應該禁用目標,並且所有其他人說它應該啓用它們,則禁用獲勝。

我想出下面的代碼:

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枚舉值(甚至是Enum文本)設置了什麼值,它都可以工作。

問題是,我不明白爲什麼,而且我擔心有些東西可能會導致它無法正常工作。基於

的順序:

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 

我本來期望它會排序啓用:True和禁用:假在列表的頂部,但它實際上是把他們的列表的底部。那是我,但爲什麼它是這樣做的?

+0

默認情況下,布爾排序順序爲FALSE,然後爲真 – digEmAll

回答

1

與您訂購

Enable + false => false 

Disable + false => false 

Enable + true => true 

Disable + false => true 

由於假訂貨布爾值當談到前true,則結果是正確的。 可能是因爲0 < 1(好吧,至少這是它的實現方式)?

只要使用OrderByDescending如果你想真正的第一(但這不是你想要的)。

但隨着你的代碼,你將無法確保

Enable true 

Disable false 

之間的順序,例如。

+0

啊,好的。所以它評估我指定的條件並輸出爲「true」或「false」,然後在布爾輸出上進行排序。這就說得通了。在我的例子中,Enable:true和Disable:false是等價的,所以對我的目的來說很好 - 我只是想完全理解邏輯,以確保它能夠繼續按預期工作。謝謝 –

+0

@Obsidian Phoenix要理解邏輯,您需要查看http://msdn.microsoft.com/en-us/library/vstudio/bb534966%28v=vs.100%29.aspx您的lambda表達式實際上選擇了鍵,通過哪些項目應該排序。顯而易見的是,表達式返回一個布爾值,可能不是什麼每個可能的Enabled/Disabled true/false求值的情況(以及在bool中排序false的事實在真實之前),並且該部分在上面被覆蓋回答。 – user3613916

相關問題