Представление типизированных N-кортежей в C # - PullRequest
8 голосов
/ 06 апреля 2011
List<struct {string, string, double} > L = new List<struct {string, string, double}>;
L.Add({"hi", "mom", 5.0});

Какой самый хороший способ получить эту функциональность в C #? Я хочу на лету определить строго типизированный кортеж (для использования в локальной функции), сохранить несколько из них в списке, выполнить некоторую обработку и вернуть результат, чтобы никогда больше не трогать список.

Меня не волнует строгая типизация, но список переменных не работает. Хочу ли я список объектов? Это самое близкое, что я могу получить?

Определение структур или классов для временных структур данных кажется мне многословным и педантичным.

Ответы [ 7 ]

7 голосов
/ 06 апреля 2011

Лучший способ представить это в C # - использовать тип Tuple

var l = new List<Tuple<string, string, double>>();
l.Add(Tuple.Create("hi", "mom", 42.0));

. Нет явной языковой поддержки для кортежей, но, как вы можете видеть, API не тоже многословный

6 голосов
/ 06 апреля 2011
var arr = new[] { Tuple.Create("hi","mom", 5.0) };

самый простой; на самом деле это массив, но список тоже достаточно прост - возможно, .ToList(), если вам лень.

Лично в этом сценарии я бы использовал анон-тип:

var arr = new[] { new { Text = "hi", Name = "mom", Value = 5.0 } };

Очень похоже, за исключением того, что имена членов более значимы.

2 голосов
/ 06 апреля 2011
List<Tuple<string, string, double>> L = new List<Tuple<string, string, double>>();
L.Add(Tuple.Create("hi", "mom", 5.0));

Подробнее о классе Tuple .

2 голосов
/ 06 апреля 2011

Вы также можете взглянуть на , используя анонимные типы в качестве альтернативы кортежам.

Пример инициализации массива типов anon и циклический просмотр результата:

var anons = new [] { new {num=1, str="str1"},
                     new {num=2, str="str2"} };

foreach(var v in anons) Console.WriteLine(v.num + " " + v.str);
1 голос
/ 06 апреля 2011

Самый простой способ, которым я могу придумать, это использовать Tuples:

        var L = new List<Tuple<string, string, double>>();

        L.Add(Tuple.Create("a", "b", 10D));

В качестве альтернативы вы также можете использовать список динамики

1 голос
/ 06 апреля 2011

Вы смотрели на класс Tuple, представленный в .NET 4.0?

Другой вариант - использовать анонимные типы .

1 голос
/ 06 апреля 2011

Если вы используете C # 4.0, вы можете использовать Tuple type

...