Как имитировать кортежи и наборы в С#?
Я хочу использовать некоторые функции python, такие как Tuples и Sets в С#. должен ли я их реализовать? или уже реализованы? может ли кто-нибудь узнать библиотеку динамических структур данных для языков .net?
Ответы
Ответ 1
.NET 3.5 имеет HashSet.
.NET 4.0 будет иметь класс Tuple. Как отмечалось в этой статье, более ранняя версия .NET содержит KeyValuePair < TKey, TValue > , который похож на Tuple < T1, T2 > , причем основное отличие заключается в том, что KeyValuePair требует, чтобы TKey был уникальным.
Ответ 2
Для наборов, HashSets (функция .NET 3.5) хорошо справляется.
Частичный ответ для кортежей:
- .NET 4.0 предоставляет [некоторую] поддержку tuples.
- Более ранние версии С# могут использовать анонимный тип (я думаю, что введен в .Net 2.0, 3.0, конечно, со всеми материалами LINQ).
Ни один из этих подходов не будет таким же удобным, как у Python; основной недостаток связан с тем, что С# статически типизирован. Однако класс С# 4.0 Tuple имеет factory -подобные статические методы, которые упрощают создание кортежей (до 8 кортежей, т.е. Кортежи с 8 членами). Например, можно иметь
var customer1 = Tuple.Create("John", "Smith", 14, 5.33, "202-123-444");
Использование анонимного типа может быть выполнено следующим образом. Основной недостаток этого подхода состоит в том, что нужно явно указывать элементы "кортежа" (хотя это именование может быть неявно "проецировано", если значения, используемые для инициализации, "проецируются" из другого объекта.
customer1 = new Customer {
Name = "John",
Surname = "Smith",
NumberOfVisits = 14,
CurrentBalance = 5.33,
PhoneNr = "202-123-444"
};
Ответ 3
Если вы работаете с .NET Framework ранее, чем уже упоминалось, Wintellect Power Collections может оказаться интересным - он имеет Pair
и Triple
для 2- и 3-кортежей, а также коллекции, такие как Set
, Bag
и Ordered
ароматы обоих.
Конечно, ничего не мешает вам реализовать 4.0 Tuple
самостоятельно.
(Кстати, нет ничего особенно "динамического" в таких структурах данных, как эти сами по себе)