Как использовать составной ключ для словаря? - PullRequest
6 голосов
/ 20 октября 2010

Мне нужно организовать словарь, где ключом будет пара enum и int. и значение является объектом. Поэтому я хочу сопоставить пару с каким-либо объектом.

Один из вариантов будет

public enum SomeEnum
{
 value1, value2
}

class Key
{
  public SomeEnum;
  public int counter;  

  // Do I have to implement Compare here?
}

Dictionary<SomeEnum, object> _myDictionary;

Другая опция конвертирует enum и int в какой-то уникальный ключ.

string key = String.Format("{0}/{1}", enumValue, intValue)

Этот подход требует парсинга строк, много дополнительной работы.

Как это легко сделать?

Ответы [ 3 ]

9 голосов
/ 20 октября 2010

Я бы пошел с чем-то похожим на

public enum SomeEnum
{
 value1, value2
}

public struct Key
{
  public SomeEnum;
  public int counter;  
}

Dictionary<Key, object>

Я думаю, что бы это сделать?

8 голосов
/ 20 октября 2010

Если вы собираетесь поместить это в словарь, то вам нужно убедиться, что вы реализуете значимые .Equals и .GetHashCode, иначе словарь будет работать неправильно.

Я бы начал с чего-то вроде следующего для базового составного ключа, а затем реализовал пользовательский IComparer, чтобы получить необходимый порядок сортировки.

public class MyKey
{
    private readonly SomeEnum enumeration;
    private readonly int number;

    public MyKey(SomeEnum enumeration, int number)
    {
        this.enumeration = enumeration;
        this.number = number;
    }

    public int Number
    {
        get { return number; }
    }

    public SomeEnum Enumeration
    {
        get { return enumeration; }
    }

    public override int GetHashCode()
    {
        int hash = 23 * 37 + this.enumeration.GetHashCode();
        hash = hash * 37 + this.number.GetHashCode();

        return hash;
    }

    public override bool Equals(object obj)
    {
        var supplied = obj as MyKey;
        if (supplied == null)
        {
            return false;
        }

        if (supplied.enumeration != this.enumeration)
        {
            return false;
        }

        if (supplied.number != this.number)
        {
            return false;
        }

        return true;
    }
}
7 голосов
/ 20 октября 2010

Если вы используете C # 4.0, вы можете использовать класс Tuple .

var key = Tuple.Create(SomeEnum.Value1, 3);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...