Ищем альтернативу List‹KeyValuePair‹string, KeyValuePair‹string, string›››

В итоге получилась эта ужасная структура данных:

List<KeyValuePair<string, KeyValuePair<string, string>>>

Вряд ли он станет огромным (‹1K, по моим оценкам), и я буду повторять этот список снова и снова.

Кто-нибудь может придумать лучшую альтернативу со встроенными типами?


person JohnIdol    schedule 24.06.2009    source источник
comment
ответы на этот вопрос могут быть полезны one-value-in-c" title="как лучше всего использовать пару, тройку и т. д. значений в качестве одного значения в c"> stackoverflow.com/questions/101825/   -  person Timothy Carter    schedule 24.06.2009


Ответы (2)


Лучшим вариантом было бы обернуть свой собственный класс Tuple, вроде того, что доставка в .NET 4.0.

Тогда у вас может быть сингл:

List<Tuple<string,string,string>>

Это достаточно легко написать в .NET 2.0 — это просто триплет значений вместо 2 в KeyValuePair. Однако встроенного эквивалента для тройки значений в .NET 2.0 нет.


Редактировать:

Прочитав ваш комментарий о запросах в другом посте, я подумал, что тоже упомяну об этом -

Даже если у вас нет уникальных значений в key1, вы можете значительно ускорить любой тип запроса/поиска, используя:

Dictionary<string, List<KeyValuePair<string,string>>>

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

person Reed Copsey    schedule 24.06.2009
comment
Мне нравится словарная версия - я тоже придумал нечто подобное (как своего рода групповой подход) - я, вероятно, буду много раз искать в этом словаре ту строку, которая теперь является ключевой. - person JohnIdol; 24.06.2009

struct MrStruct
{
   public string Key1,
   public string Key2,
   public string Value1
}


List<MrStruct>;

Это предполагает, что вы обращаетесь к списку последовательно, как вы сказали, повторять. Потенциально другие структуры данных могут быть быстрее для поиска.

person kemiller2002    schedule 24.06.2009
comment
просто и ясно - мне это нравится - будет ли это работать лучше, чем то, что я запрашиваю на key1? - person JohnIdol; 24.06.2009
comment
Если key1 уникален, вы можете рассмотреть SortedList‹string, MrStruct›, в противном случае вы можете отсортировать свой List‹› на основе MrStruct.Key1 для повышения производительности. - person user7116; 24.06.2009
comment
Какой тип запроса вы делаете? Если Key1 уникален, использование словаря будет намного быстрее... - person Reed Copsey; 24.06.2009
comment
Зависит от нескольких различных факторов, вы можете отсортировать ключи по Key1 и, предполагая, что Key1 уникален, вы можете выполнить двоичный поиск по нему, который дает вам приблизительное время поиска o (log n). Поскольку у вас тоже есть список, а не что-то вроде хеш-таблицы, я думаю, что это будет самый быстрый поиск, который вы можете выполнить. - person kemiller2002; 24.06.2009
comment
Key1 не уникален (иначе выбрал бы словарь) - person JohnIdol; 24.06.2009
comment
Словарь может быть быстрее в зависимости от сценария. Создание словаря может занять больше времени, чем создание списка, и если вы выполняете только несколько поисков по нему и все еще планируете повторение всего списка, эта структура, вероятно, в конечном итоге сработает против вас. - person kemiller2002; 24.06.2009
comment
@JohnIdol: см. мою версию словарного подхода с неуникальными ключами. Это немного некрасиво, но это сделает поиск всех элементов с заданным значением key1 очень быстрым - намного быстрее, чем любой другой из перечисленных вариантов. Если вы выполняете много поисков, это может помочь. - person Reed Copsey; 24.06.2009
comment
Я думаю, вам придется проверить это, потому что вы собираетесь потратить время на настройку для создания словаря, и будет гораздо сложнее извлечь все значения, если вам нужен полный список. - person kemiller2002; 24.06.2009
comment
Кевин, есть ли причина использовать структуру? Я знаю, что KeyValuePair struct, но это снижает производительность. - person Ben; 07.06.2015
comment
Все зависит от того, что вы хотите с этим делать. Удар по производительности незначителен, и по большому счету класс и структура почти никогда не должны сравниваться для оптимизации производительности. На самом деле следует спросить, нужно ли мне передавать его по ссылке или по значению? - person kemiller2002; 07.06.2015