Uwielbiam krotki . Pozwalają szybko grupować istotne informacje bez konieczności pisania dla nich struktury lub klasy. Jest to bardzo przydatne podczas refaktoryzacji bardzo zlokalizowanego kodu.
Inicjowanie ich listy wydaje się jednak nieco zbędne.
var tupleList = new List<Tuple<int, string>>
{
Tuple.Create( 1, "cow" ),
Tuple.Create( 5, "chickens" ),
Tuple.Create( 1, "airplane" )
};
Czy nie ma lepszego sposobu? Chciałbym znaleźć rozwiązanie zgodne z inicjatorem Dictionary .
Dictionary<int, string> students = new Dictionary<int, string>()
{
{ 111, "bleh" },
{ 112, "bloeh" },
{ 113, "blah" }
};
Czy nie możemy użyć podobnej składni?
Dictionary
nie zezwala na duplikowanie kluczy.Odpowiedzi:
c # 7.0 pozwala to zrobić:
Jeśli nie potrzebujesz
List
tylko tablicy, możesz:A jeśli nie lubisz „Item1” i „Item2”, możesz:
lub dla tablicy:
co pozwala ci zrobić:
tupleList[0].Index
itupleList[0].Name
Framework 4.6.2 i poniżej
Musisz zainstalować
System.ValueTuple
z Menedżera pakietów Nuget.Ramy 4.7 i nowsze
Jest wbudowany w ramy. Czy nie instalować
System.ValueTuple
. W rzeczywistości usuń go i usuń z katalogu bin.Uwaga: W prawdziwym życiu nie byłbym w stanie wybierać między krową, kurczakiem lub samolotem. Byłbym naprawdę rozdarty.
źródło
System.ValueTuple
obsługuje rdzeń 2.0. Ale spróbuj najpierw bez Nugeta, ponieważ niepotrzebne pakiety mogą powodować problemy. Tak czy inaczej, tak. Użyj c # v7 lub nowszej, jeśli to możliwe.Tak! To jest możliwe .
Umożliwia to wykonanie następujących czynności:
źródło
groceryList[0] == groceryList[1]
lub czy należy wprowadzić porównanie?C # 6 dodaje nową funkcję tylko do tego: rozszerzenie Dodaj metody. Zawsze było to możliwe dla VB.net, ale jest teraz dostępne w języku C #.
Teraz nie musisz dodawać
Add()
metod bezpośrednio do swoich klas, możesz je zaimplementować jako metody rozszerzeń. Rozszerzając dowolny typ wyliczalny za pomocąAdd()
metody, będziesz mógł używać go w wyrażeniach inicjalizujących kolekcję. Więc nie musisz już czerpać z list wyraźnie ( jak wspomniano w innej odpowiedzi ), możesz po prostu go rozszerzyć.To pozwoli ci to zrobić na dowolnej klasie, która implementuje
IList<>
:Oczywiście nie jesteś ograniczony do rozszerzania kolekcji krotek, może to być dla zbiorów dowolnego określonego typu, dla którego chcesz specjalnej składni.
C # 7 będzie dodawać obsługę krotek wbudowanych w język, choć będą one innego typu (
System.ValueTuple
zamiast tego). Dlatego dobrze byłoby dodać przeciążenia dla krotek wartości, abyś miał również możliwość ich użycia. Niestety nie ma między nimi żadnych domyślnych konwersji.W ten sposób inicjalizacja listy będzie wyglądać jeszcze ładniej.
Ale zamiast przejść przez te wszystkie kłopoty, może być po prostu lepiej przejść na używanie
ValueTuple
wyłącznie.źródło
TupleList<int, string>.
się bardziej czytelne niżList<Tuple<int, string>>
.using TupleList = System.Collections.Generic.List<System.Tuple<int, string>>;
Możesz to zrobić, wywołując konstruktor za każdym razem, gdy jest nieco lepszy
źródło
Tuple.Create
zamiast tego i możesz wywnioskować argumenty typuStare pytanie, ale zwykle tak robię, aby uczynić rzeczy nieco bardziej czytelnymi:
źródło
Super Duper Old Wiem, ale chciałbym dodać swój artykuł na temat używania Linq i lambda kontynuacji na metodach przy użyciu C # 7. Próbuję używać nazwanych krotek jako zamienników DTO i anonimowych projekcji, gdy ponownie użyję ich w klasie. Tak, do wyśmiewania i testowania wciąż potrzebujesz klas, ale robienie rzeczy w linii i przekazywanie w klasie miło jest mieć tę nowszą opcję IMHO. Możesz utworzyć je z
źródło
Dlaczego lubisz krotki? To jak anonimowe typy: bez nazw. Nie rozumiem struktury danych.
Lubię klasyczne zajęcia
źródło
Myślę, że jedna technika jest trochę łatwiejsza i nie została tu wcześniej wspomniana:
Myślę, że to trochę czystsze niż:
źródło
var
czy nie. Ja osobiście wolę pisanie jawne (gdy nie jest duplikowane np. W konstruktorze).źródło