2017-05-24 32 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

谢谢。这帮助了我很多,是的,我像你说的那样从字典中转换过来。当时我脑子里有一个想法,但我没有评论它为什么我使用了一本字典,所以除非我找到一个不使用数组/列表的理由,否则不好使用它们,不要再使用它 –