Я люблю кортежи . Они позволяют вам быстро сгруппировать релевантную информацию без необходимости писать структуру или класс для нее. Это очень полезно при рефакторинге очень локализованного кода.
Инициализация их списка, однако, кажется немного излишней.
var tupleList = new List<Tuple<int, string>>
{
Tuple.Create( 1, "cow" ),
Tuple.Create( 5, "chickens" ),
Tuple.Create( 1, "airplane" )
};
Нет ли лучшего способа? Я хотел бы найти решение, аналогичное инициализатору словаря .
Dictionary<int, string> students = new Dictionary<int, string>()
{
{ 111, "bleh" },
{ 112, "bloeh" },
{ 113, "blah" }
};
Разве мы не можем использовать подобный синтаксис?
Dictionary
не позволяет дублировать ключи.Ответы:
C # 7.0 позволяет вам сделать это:
Если вам не нужен
List
, а только массив, вы можете сделать:И если вам не нравятся «Item1» и «Item2», вы можете сделать:
или для массива:
что позволяет вам делать:
tupleList[0].Index
иtupleList[0].Name
Framework 4.6.2 и ниже
Вы должны установить
System.ValueTuple
из диспетчера пакетов Nuget.Framework 4.7 и выше
Он встроен в рамки. Вы не устанавливать
System.ValueTuple
. Фактически удалите его и удалите из каталога bin.примечание: в реальной жизни я не смог бы выбирать между коровой, курицей или самолетом. Я был бы действительно разорван.
источник
System.ValueTuple
поддерживает ядро 2.0. Но попробуйте сначала без Nuget, так как ненужные пакеты могут вызвать проблемы. Так или иначе, да. Используйте c # v7 или выше, если это возможно.Да! Это возможно .
Это позволяет вам сделать следующее:
источник
groceryList[0] == groceryList[1]
или сравнение должно быть реализовано?C # 6 добавляет новую функцию только для этого: расширение Добавить методы. Это всегда было возможно для VB.net, но теперь доступно в C #.
Теперь вам не нужно добавлять
Add()
методы в ваши классы напрямую, вы можете реализовать их как методы расширения. Расширяя любой перечислимый типAdd()
методом, вы сможете использовать его в выражениях инициализатора коллекции. Таким образом, вам больше не нужно явно получать списки ( как уже упоминалось в другом ответе ), вы можете просто расширить его.Это позволит вам сделать это на любом классе, который реализует
IList<>
:Конечно, вы не ограничены расширением коллекций кортежей, это может быть для коллекций любого определенного типа, для которого вы хотите специальный синтаксис.
C # 7 будет добавлять поддержку кортежей, встроенных в язык, хотя они будут другого типа (
System.ValueTuple
вместо этого). Поэтому было бы хорошо добавить перегрузки для кортежей значений, чтобы у вас была возможность их использовать. К сожалению, между ними нет неявных преобразований.Таким образом, инициализация списка будет выглядеть еще лучше.
Но вместо того, чтобы проходить через все эти неприятности, может быть, лучше просто перейти на использование
ValueTuple
исключительно.источник
TupleList<int, string>.
его более читабельным, чемList<Tuple<int, string>>
.using TupleList = System.Collections.Generic.List<System.Tuple<int, string>>;
Вы можете сделать это, вызывая конструктор каждый раз с немного лучше
источник
Tuple.Create
вместо этого, и вы можете вывести аргументы типаСтарый вопрос, но это то, что я обычно делаю, чтобы сделать вещи немного более читабельными:
источник
Super Duper Old Я знаю, но я бы добавил свою статью об использовании Linq и продолжении лямбда-выражений для методов с использованием C # 7. Я пытаюсь использовать именованные кортежи в качестве замены для DTO и анонимных проекций при повторном использовании в классе. Да, для насмешек и тестирования вам все еще нужны классы, но делать что-то встроенное и проходить в классе хорошо, если у вас есть этот новый вариант ИМХО. Вы можете создать их экземпляр из
источник
Почему нравятся кортежи? Это как анонимные типы: без имен. Не могу понять структуру данных.
Мне нравятся классические занятия
источник
Одна техника, я думаю, немного проще, и она не упоминалась здесь ранее:
Я думаю, что это немного чище, чем:
источник
var
. Я лично предпочитаю явную типизацию (когда она не дублируется, например, в конструкторе).источник