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 einer Add()
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.
public static class TupleListExtensions
{
public static void Add<T1, T2>(this IList<Tuple<T1, T2>> list,
T1 item1, T2 item2)
{
list.Add(Tuple.Create(item1, item2));
}
public static void Add<T1, T2, T3>(this IList<Tuple<T1, T2, T3>> list,
T1 item1, T2 item2, T3 item3)
{
list.Add(Tuple.Create(item1, item2, item3));
}
// and so on...
}
Auf diese Weise können Sie dies für jede Klasse tun, die Folgendes implementiert IList<>
:
var numbers = new List<Tuple<int, string>>
{
{ 1, "one" },
{ 2, "two" },
{ 3, "three" },
{ 4, "four" },
{ 5, "five" },
};
var points = new ObservableCollection<Tuple<double, double, double>>
{
{ 0, 0, 0 },
{ 1, 2, 3 },
{ -4, -2, 42 },
};
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.
public static class BigIntegerListExtensions
{
public static void Add(this IList<BigInteger> list,
params byte[] value)
{
list.Add(new BigInteger(value));
}
public static void Add(this IList<BigInteger> list,
string value)
{
list.Add(BigInteger.Parse(value));
}
}
var bigNumbers = new List<BigInteger>
{
new BigInteger(1), // constructor BigInteger(int)
2222222222L, // implicit operator BigInteger(long)
3333333333UL, // implicit operator BigInteger(ulong)
{ 4, 4, 4, 4, 4, 4, 4, 4 }, // extension Add(byte[])
"55555555555555555555555555555555555555", // extension Add(string)
};
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.
public static class ValueTupleListExtensions
{
public static void Add<T1, T2>(this IList<Tuple<T1, T2>> list,
ValueTuple<T1, T2> item) => list.Add(item.ToTuple());
}
Auf diese Weise sieht die Listeninitialisierung noch besser aus.
var points = new List<Tuple<int, int, int>>
{
(0, 0, 0),
(1, 2, 3),
(-1, 12, -73),
};
Aber anstatt all diese Probleme zu lösen, ist es möglicherweise besser, auf die ValueTuple
ausschließliche Verwendung umzusteigen.
var points = new List<(int, int, int)>
{
(0, 0, 0),
(1, 2, 3),
(-1, 12, -73),
};