2017-05-24 34 views
0

因此,我使用一組枚舉來確定4個插槽的值。有一個叫做無,然後有4個叫火,土,水,空氣。插槽的值保存在一個整數字典中,作爲索引,枚舉值作爲值。我想檢查這本詞典的值,看看是否存在某些組合。我不確定如何在沒有硬編碼的情況下最有效地做到這一點。我知道如何存儲組合,但我不確定如何去有效地檢查這些值。檢查組合值

這個想法是,如果組合是火災,火災,火災,火災,那麼它會啓動某個事件/功能。

回答

0

我對字典有點困惑,因爲它聽起來像你只是用鍵來表示序列。我猜這是一個SortedDictionary<int, Elements>(雖然它可能並不重要)。但首先:

要比較任何兩個列表,您可以使用SequenceEquals

比方說,這是你的枚舉:

enum Elements { None, Fire, Earth, Water, Air } 

比方說,你正在檢查的組合是:

var elementsToMatch = new Elements[] { Elements.Fire, Elements.Fire, Elements.Fire }; 

你可以這樣做:

var matches = dictionary.Values.SequenceEquals(elementsToMatch); 

這是真的如果兩個集合包含相同序列中的相同元素,則爲false。

如果順序並不重要,只是元素的組合,那麼你可以先對它們進行排序:

var matches = dictionary.Values.OrderBy(v=>v) 
    .SequenceEquals(elementsToMatch.OrderBy(e=>e)); 

是一個Dictionary要做到這一點?

你可以這樣做:

var elements = new Dictionary<int, Elements>(); // or SortedDictionary 
elements.Add(0, Elements.None); 
elements.Add(1, Elements.Fire); 
// etc. 

或者你可以這樣做:

var elements = new Elements[] { Elements.None, Elements.Water }; 

或者使用List<Elements>

在任何情況下,你訪問它會是完全一樣的方式:

elements[0] 
elements[1] 
// etc 

與字典它可能是一個關鍵的可能會丟失。可能有一個elements[0]elements[2]但沒有elements[1]

如果Dictionary的唯一原因是爲每個元素提供一個位置,那麼你可以使用一個數組或一個列表,因爲每個元素都可以被它的位置引用。

+0

謝謝。這幫助了我很多,是的,我像你說的那樣從字典中轉換過來。當時我腦子裏有一個想法,但我沒有評論它爲什麼我使用了一本字典,所以除非我找到一個不使用數組/列表的理由,否則不好使用它們,不要再使用它 –