'Надлежащий' набор для использования для получения объектов в O (1) время в.NET C#?

Для этого вам понадобятся IMultiValueConverter и MultiBinding

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

Вариант 1 :
Недостаток: вы должны вернуть свой фон «по умолчанию» тоже

Конвертер:

[110 ]

Использование:


    
        
            
            
        
    
    This matches

Вариант 2: Использование Trigger внутри конвертера Style

:

public class DistinctValuesMultiValueConverter : IMultiValueConverter
{
    public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
    {
        return values.Distinct().Count() == 1;
    }

    public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}

Стиль:


Использование:


    This matches

Вариант 3 (только для вашей информации): : Вы также можете использовать Behavior

6
задан Pandincus 1 December 2008 в 14:19
поделиться

4 ответа

При использовании.Net 3.5 попробуйте HashSet. Если Вы не используете.Net 3.5, попробуйте C5. Иначе Ваш существующий метод в порядке (bool, как @leppie предполагает, лучше, или не, как @JonSkeet предполагает, серовато-коричневый серовато-коричневый серовато-коричневый!).

HashSet<string> stringSet = new HashSet<string>(someStringCollection);

if (stringSet.Contains(someString))
{
    ...
}
9
ответ дан 8 December 2019 в 16:12
поделиться

Можно использовать HashSet<T> в.NET 3.5, еще я просто придерживался бы Вас существующий метод (на самом деле, я предпочту Dictionary<string,bool> но у каждого не всегда есть та роскошь).

3
ответ дан 8 December 2019 в 16:12
поделиться

Я должен, вероятно, сделать это вопросом, потому что я вижу проблему так часто. Что заставляет Вас думать, что словари являются O (1)? Технически, единственной вещью, вероятно, чтобы быть чем-то как O (1) является доступ в стандарт индексированный целым числом фиксировано-ограниченный массив с помощью целочисленного индексного значения (там являющийся никаким поиском в массивах, реализовал тот путь).

Предположение, что, если это похоже на ссылку на массив, это - O (1), когда "индекс" является значением, которое должно искаться так или иначе, однако негласно, означает, что это маловероятно схема O(1), если Вам не посчастливилось получить хеш-функцию с данными, которые не имеют никаких коллизий (и вероятно много потраченных впустую ячеек).

Я вижу эти вопросы, и я даже вижу ответы, что заявление O (1) [не по этому конкретному вопросу, но я действительно кажусь ими вокруг] без выравнивания или объяснения того, что требуется, чтобы удостоверяться, что O (1) на самом деле достигается.

Хм, я предполагаю, что это - достойный вопрос. Я сделаю это после того, как я отправлю этот комментарий здесь.

1
ответ дан 8 December 2019 в 16:12
поделиться

что-то, что Вы могли бы хотеть добавить, является начальным размером к Вашему хешу. Я не уверен, реализован ли C# по-другому, чем Java, но он обычно имеет некоторый размер по умолчанию, и если Вы добавляете больше, чем которые, он расширяет набор. Однако правильно размерный хеш важен для достижения максимально близко к O (1). Цель состоит в том, чтобы получить точно 1 запись в каждом блоке, не делая это действительно огромным. Если Вы делаете некоторый поиск, я знаю, что существует предложенное отношение для калибровки хеш-таблицы, предполагая, что Вы знаете заранее, сколько элементов Вы будете добавлять. Например, что-то как "хеш должно быть измерено в 1.8x число элементов, которое будет добавлено" (не реальное отношение, просто пример).

Из Википедии:

С хорошей хеш-функцией хеш-таблица может обычно содержать приблизительно на 70%-80% больше элементов, чем она действительно представляет слоты в виде таблицы и все еще работает хорошо. В зависимости от механизма разрешения коллизий производительность может начать страдать или постепенно или существенно поскольку добавляется больше элементов. Для контакта с этим, когда коэффициент загрузки превышает некоторый порог, необходимо выделить новую, большую таблицу и добавить все содержание исходной таблицы к этой новой таблице. В классе HashMap Java, например, порог коэффициента загрузки по умолчанию 0.75.

2
ответ дан 8 December 2019 в 16:12
поделиться
Другие вопросы по тегам:

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