C# 6 bietet dafür eine neue Funktion: die Erweiterung Add methods. Dies war schon immer für VB.net möglich, ist aber jetzt auch in C# verfügbar.
Jetzt müssen Sie nicht mehr Add()
Methoden nicht direkt in Ihre Klassen aufnehmen, können Sie sie als Erweiterungsmethoden implementieren. Bei der Erweiterung eines beliebigen aufzählbaren Typs mit einer Add()
Methode können Sie sie in Initialisierungsausdrücken für Sammlungen verwenden. Sie müssen also nicht mehr explizit von Listen ableiten ( wie in einer anderen Antwort erwähnt ), können Sie es 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...
}
Dies ermöglicht es Ihnen, dies bei jeder Klasse zu tun, die die 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 sind Sie nicht darauf beschränkt, Sammlungen von Tupeln zu erweitern, sondern können Sammlungen eines beliebigen Typs verwenden, 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 Unterstützung für in die Sprache eingebaute Tupel hinzufügen, obwohl diese von einem anderen Typ sein werden ( System.ValueTuple
stattdessen). Es wäre also gut, Überladungen für Werttupel hinzuzufügen, damit Sie die Möglichkeit 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 wird die Listeninitialisierung noch schöner aussehen.
var points = new List<Tuple<int, int, int>>
{
(0, 0, 0),
(1, 2, 3),
(-1, 12, -73),
};
Aber anstatt sich all diese Mühe zu machen, ist es vielleicht besser, auf die Verwendung von ValueTuple
ausschließlich.
var points = new List<(int, int, int)>
{
(0, 0, 0),
(1, 2, 3),
(-1, 12, -73),
};