Хеш-таблица с двумя первичными ключами - PullRequest
3 голосов
/ 14 января 2011

Использование System.Collections как создать коллекцию с двумя первичными ключами?

Я имею в виду, что новые записи с той же комбинацией исключаются, но каждый ключ может использоваться с другими ключами (например, объединение двух первичных ключей в SQL)

Ответы [ 3 ]

5 голосов
/ 14 января 2011

Вы можете просто использовать struct, пример:

struct CompositeKey<T1,T2>
{
  public T1 Item1;
  public T2 Item2;
}

Тогда используйте это как ключ.

2 голосов
/ 07 ноября 2013

Как сказал LaGrandMere, вы можете использовать System.Tuple , если вы используете .NET 4.0 или более позднюю версию:

Tuple<int,string> key = Tuple.Create(0, "Test");

Также обратите внимание, что если вы помещаете строки,в качестве ключей в словарях вы должны использовать ints и т. д., которые бы имели значение NULL в SQL.Не может иметь нулевой ключ в словаре.

var dict = new Dictionary<Tuple<string, int>, string>();

var address1 = Tuple.Create("5th Avenue",15);
var address2 = Tuple.Create("5th Avenue",25);
var address3 = Tuple.Create("Dag Hammarskjölds väg", 4);

dict[address1] = "Donald";
dict[address2] = "Bob";
dict[address3] = "Kalle";

// ...

int number = Int32.Parse("25");
var addressKey = Tuple.Create("5th Avenue",number);
string name = dict[addressKey]; // Bob
2 голосов
/ 14 января 2011

Вы можете использовать Tuple , если используете .NET 4.0.

В противном случае вы можете создать кортеж самостоятельно.

Найдено в StackOverFlow: Кортежи (или массивы) в качестве ключей словаря в C #

struct Tuple<T, U, W> : IEquatable<Tuple<T,U,W>>
{
    readonly T first;
    readonly U second;
    readonly W third;

    public Tuple(T first, U second, W third)
    {
        this.first = first;
        this.second = second;
        this.third = third;
    }

    public T First { get { return first; } }
    public U Second { get { return second; } }
    public W Third { get { return third; } }

    public override int GetHashCode()
    {
        return first.GetHashCode() ^ second.GetHashCode() ^ third.GetHashCode();
    }

    public override bool Equals(object obj)
    {
        if (obj == null || GetType() != obj.GetType())
        {
            return false;
        }
        return Equals((Tuple<T, U, W>)obj);
    }

    public bool Equals(Tuple<T, U, W> other)
    {
        return other.first.Equals(first) && other.second.Equals(second) && other.third.Equals(third);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...