Как найти «первое» значение в словаре?

Asked
Viewd20191

5

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

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

  • @Pavel: Ух ты… Я многому научился за почти 2 года.Хотел бы я тогда знать то, что знаю сейчас.

    IAbstract17 августа 2011, 23:14
  • С точки зрения производительности все, что вы можете сделать здесь, - LINQ и т. д. - не будет быстрее, чем foreach, потому что вы не выполняете поиск по ключу словаря.Быстрый только поиск ключа;для чего-то еще вы должны выполнить линейное сканирование (или поддерживать второй словарь для другого ключа, который будет соответствовать тому, что вы ищете).

    Pavel Minaev13 ноября 2009, 20:33

4 ответов

6

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

5

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

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

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

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

  • Спасибо всем за ответы.Я был почти уверен, что foreach будет единственным способом сделать то, что я хочу, - но просто хотел узнать, есть ли у кого-нибудь идеи, о которых я не думал… :)

    IAbstract17 ноября 2009, 16:51
7

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

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

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

2

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

  • поможет, если вы сможете добавить к своему ответу больше контекста

    Edwin Ikechukwu Okonkwo29 сентября 2016, 08:42
  • .First () на чем?такого метода нет в Dictionary obj.

    Edwin Ikechukwu Okonkwo29 сентября 2016, 08:42
  • Это метод расширения, поэтому вы увидите его только при импорте System.Linq

    maxpower4729 сентября 2016, 15:41