Как найти «первое» значение в словаре? - PullRequest
5 голосов
/ 13 ноября 2009

Как найти первое значение в Dictionary<int, MyTableClass>, где MyTableClass наследует Field<F1, F2, F3>? Я бы предпочел комбинацию свойства или свойства / метода, которая возвращает первое значение в словаре, где F1 = MyEnum.value.

Чего я не хочу, так это foreach. С точки зрения производительности, это действительно не предпочтительный метод.

Ответы [ 4 ]

7 голосов
/ 13 ноября 2009

Кратчайший способ найти значение, соответствующее некоторым критериям (я не совсем понял, чего конкретно вы хотите - сначала F1 - это параметр общего типа, а затем вы используете == для его сравнения, как если бы значение ...) это сделать:

dictionary.Values.First(x => ...);

, где ... будет логическим выражением x. Однако это не будет быстрее, чем foreach ..., потому что вы не выполняете поиск по словарному ключу. Быстрый поиск только по ключевым словам; для чего-то еще вы должны выполнить линейное сканирование (или сохранить второй словарь для другого ключа, который будет использоваться для поиска). [скопировано из комментария]

6 голосов
/ 13 ноября 2009

Независимо от того, как вы оденете это здесь, вам, по сути, придется сделать foreach над значениями в Dictionary. Dictionary<TKey,TValue> обеспечивает близкий к O (1) доступ для полного ключа к заданному значению. Он не предназначен для обеспечения эффективного доступа к частичному ключу. Чтобы получить это, вам нужно сохранить второй Dictionary экземпляр, создающий соответствующее отображение.

5 голосов
/ 13 ноября 2009

Словарь не поддерживает какой-либо определенный порядок между элементами, поэтому на самом деле нет ни одного элемента, который может быть первым, если вы не укажете какое-либо упорядочение.

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

MyTableClass one = dict.Where(pair => pair.Value.F1 == MyEnum.value).First();

Это будет просто проходить по элементам, пока не будет найдено совпадение, поэтому вы просто используете словарь в качестве списка. Если вы хотите какую-либо производительность, у вас должен быть словарь, в котором значение от F1 является ключом.

2 голосов
/ 13 ноября 2009

Вы можете использовать метод расширения .First ().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...