Как моделировать кортежи и наборы в C # - PullRequest
16 голосов
/ 11 апреля 2010

Я хочу использовать некоторые функции Python, такие как Tuples и Sets в c #. я должен реализовать их? или там уже реализовано? кто-нибудь знает библиотеку динамических структур данных для языков .net?

Ответы [ 3 ]

14 голосов
/ 11 апреля 2010

.NET 3.5 имеет HashSet .

.NET 4.0 будет иметь класс Tuple . Как отмечалось в статье, более ранняя версия .NET содержит KeyValuePair , который похож на Tuple , с основным отличием в том, что KeyValuePair требует, чтобы TKey был уникальным.

3 голосов
/ 11 апреля 2010

Для наборов HashSets (функция .NET 3.5) справляется с задачей достаточно хорошо.

Частичный ответ для кортежей:

  • .NET 4.0 обеспечивает [некоторую] поддержку кортежей .
  • Более ранние версии C # могут использовать анонимный тип (я думаю, что он был введен в .Net 2.0, 3.0 наверняка со всеми вещами LINQ).

Ни один из этих подходов не так удобен, как с Python; основной недостаток связан с тем, что C # статически типизирован. Однако класс кортежей C # 4.0 имеет фабричные статические методы, которые облегчают создание кортежей (до 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"
  };
1 голос
/ 11 апреля 2010

Если вы работаете с .NET Framework ранее, чем уже упоминалось, Wintellect Power Collections может оказаться интересным - он имеет Pair и Triple для 2- и 3-кортежей, и коллекции, такие как Set, Bag и Ordered вкусы обоих.

Конечно, ничто не мешает вам реализовать Tuple 4.0 самостоятельно.

(Кстати, нет ничего особенно «динамичного» в таких структурах данных, как они сами по себе)

...