Кортежи (или массивы) как Словарь вводят C#

Непосредственно на полосе прокрутки:

<ScrollViewer HorizontalScrollBarVisibility="Hidden" />

Если вы делаете это в элементе управления, который реализует его в шаблоне ControlTemplate:

<StackPanel ScrollViewer.HorizontalScrollBarVisibility="Hidden" />
104
задан dance2die 5 June 2009 в 14:57
поделиться

3 ответа

Если вы используете .NET 4.0, используйте кортеж:

lookup = new Dictionary<Tuple<TypeA, TypeB, TypeC>, string>();

Если нет, вы можете определить кортеж и использовать его в качестве ключа. Кортеж должен переопределить GetHashCode, Equals и IEquatable:

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);
    }
}
107
ответ дан 24 November 2019 в 04:10
поделиться

Если по какой-то причине вы действительно хотите избежать создания собственного класса Tuple или использования встроенного в .NET 4.0 класса on, существует еще один возможный подход; вы можете объединить три ключевых значения вместе в одно значение.

Например, если три значения являются целыми типами вместе, не занимая более 64 бит, вы можете объединить их в ulong .

В худшем случае вы всегда можете использовать строку, если убедитесь, что три компонента в ней разделены некоторым символом или последовательностью, которая не встречается внутри компонентов ключа, например, тремя числами, которые вы можете попробовать:

string.Format("{0}#{1}#{2}", key1, key2, key3)

Очевидно, что в этом подходе есть некоторые накладные расходы на композицию, но в зависимости от того, для чего вы его используете, это может быть достаточно тривиальным, чтобы не заботиться об этом.

7
ответ дан 24 November 2019 в 04:10
поделиться

I would override your Tuple with a proper GetHashCode, and just use it as the key.

As long as you overload the proper methods, you should see decent performance.

4
ответ дан 24 November 2019 в 04:10
поделиться
Другие вопросы по тегам:

Похожие вопросы: