Ich liebe Tupel . Mit ihnen können Sie relevante Informationen schnell gruppieren, ohne eine Struktur oder Klasse dafür schreiben zu müssen. Dies ist sehr nützlich, wenn Sie sehr lokalisierten Code umgestalten.
Das Initialisieren einer Liste von ihnen scheint jedoch etwas überflüssig.
var tupleList = new List<Tuple<int, string>>
{
Tuple.Create( 1, "cow" ),
Tuple.Create( 5, "chickens" ),
Tuple.Create( 1, "airplane" )
};
Gibt es keinen besseren Weg? Ich würde eine Lösung nach dem Vorbild des Dictionary-Initialisierers lieben .
Dictionary<int, string> students = new Dictionary<int, string>()
{
{ 111, "bleh" },
{ 112, "bloeh" },
{ 113, "blah" }
};
Können wir keine ähnliche Syntax verwenden?
Dictionary
erlaubt keine doppelten Schlüssel.Antworten:
Mit c # 7.0 können Sie Folgendes tun:
Wenn Sie kein
List
, sondern nur ein Array benötigen , können Sie Folgendes tun:Und wenn Sie "Item1" und "Item2" nicht mögen, können Sie Folgendes tun:
oder für ein Array:
Damit können Sie Folgendes tun:
tupleList[0].Index
undtupleList[0].Name
Framework 4.6.2 und niedriger
Sie müssen
System.ValueTuple
über den Nuget Package Manager installieren .Framework 4.7 und höher
Es ist in das Framework eingebaut. Sie nicht installieren
System.ValueTuple
. Entfernen Sie es tatsächlich und löschen Sie es aus dem bin-Verzeichnis.Hinweis: Im wirklichen Leben könnte ich nicht zwischen Kuh, Hühnern oder Flugzeug wählen. Ich wäre wirklich hin und her gerissen.
quelle
System.ValueTuple
unterstützt Core 2.0. Versuchen Sie es jedoch zuerst ohne Nuget, da unnötige Pakete Probleme verursachen können. Also so oder so, ja. Verwenden Sie nach Möglichkeit c # v7 oder höher.Ja! Das ist möglich .
Auf diese Weise können Sie Folgendes tun:
quelle
groceryList[0] == groceryList[1]
oder muss ein vergleich durchgeführt werden?C # 6 fügt nur hierfür eine neue Funktion hinzu: Erweiterung Methoden hinzufügen. Dies war für VB.net immer möglich, ist aber jetzt in C # verfügbar.
Jetzt müssen Sie
Add()
Ihren Klassen keine Methoden mehr direkt hinzufügen, sondern können sie als Erweiterungsmethoden implementieren. Wenn Sie einen Aufzählungstyp mit einerAdd()
Methode erweitern, können Sie ihn in Initialisierungsausdrücken für Sammlungen verwenden. Sie müssen also nicht mehr explizit von Listen ableiten ( wie in einer anderen Antwort erwähnt ), sondern können diese einfach erweitern.Auf diese Weise können Sie dies für jede Klasse tun, die Folgendes implementiert
IList<>
:Natürlich können Sie nicht nur Tupel-Sammlungen erweitern, sondern auch Sammlungen eines bestimmten Typs, für den Sie die spezielle Syntax wünschen.
C # 7 wird die Unterstützung für in die Sprache integrierte Tupel hinzufügen, obwohl sie (
System.ValueTuple
stattdessen) von einem anderen Typ sind . Es wäre also gut, Überladungen für Wertetupel hinzuzufügen, damit Sie die Option haben, diese auch zu verwenden. Leider sind keine impliziten Konvertierungen zwischen den beiden definiert.Auf diese Weise sieht die Listeninitialisierung noch besser aus.
Aber anstatt all diese Probleme zu lösen, ist es möglicherweise besser, auf die
ValueTuple
ausschließliche Verwendung umzusteigen.quelle
TupleList<int, string>.
, dass sie besser lesbar ist alsList<Tuple<int, string>>
.using TupleList = System.Collections.Generic.List<System.Tuple<int, string>>;
Sie können dies tun, indem Sie den Konstruktor jedes Mal aufrufen, wenn dies etwas besser ist
quelle
Tuple.Create
stattdessen stattdessen und Sie können die Typargumente ableitenAlte Frage, aber das ist es, was ich normalerweise mache, um die Dinge ein bisschen lesbarer zu machen:
quelle
Super Duper Old Ich weiß, aber ich würde mein Stück über die Verwendung von Linq und Continuation Lambdas zu Methoden mit C # 7 hinzufügen. Ich versuche, benannte Tupel als Ersatz für DTOs und anonyme Projektionen zu verwenden, wenn sie in einer Klasse wiederverwendet werden. Ja, zum Verspotten und Testen benötigen Sie noch Klassen, aber es ist schön, diese neuere Option IMHO zu haben, wenn Sie Dinge inline erledigen und in einer Klasse herumreichen. Sie können sie von instanziieren
quelle
Warum magst du Tupel? Es ist wie bei anonymen Typen: keine Namen. Kann die Struktur von Daten nicht verstehen.
Ich mag klassische Klassen
quelle
Eine Technik, die ich für etwas einfacher halte und die hier noch nicht erwähnt wurde:
Ich finde das etwas sauberer als:
quelle
var
oder nicht. Ich persönlich bevorzuge die explizite Eingabe (wenn sie nicht zB im Konstruktor dupliziert wird).quelle