C # 6 aggiunge una nuova funzionalità proprio per questo: estensione Aggiungi metodi. Questo è sempre stato possibile per VB.net ma ora è disponibile in C #.
Ora non devi aggiungere Add()
metodi direttamente alle tue classi, puoi implementarli come metodi di estensione. Quando estendi qualsiasi tipo enumerabile con un Add()
metodo, sarai in grado di usarlo nelle espressioni di inizializzazione della raccolta. Quindi non devi più derivare esplicitamente dagli elenchi ( come menzionato in un'altra risposta ), puoi semplicemente estenderlo.
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...
}
Ciò ti consentirà di farlo su qualsiasi classe che implementa 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 },
};
Ovviamente non sei limitato all'estensione di raccolte di tuple, può essere per raccolte di qualsiasi tipo specifico per cui desideri la sintassi speciale.
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 aggiungerà il supporto per le tuple integrate nella lingua, anche se saranno di tipo diverso ( System.ValueTuple
invece). Quindi sarebbe bene aggiungere sovraccarichi per le tuple di valore in modo da avere anche la possibilità di usarli. Sfortunatamente, non ci sono conversioni implicite definite tra i due.
public static class ValueTupleListExtensions
{
public static void Add<T1, T2>(this IList<Tuple<T1, T2>> list,
ValueTuple<T1, T2> item) => list.Add(item.ToTuple());
}
In questo modo l'inizializzazione dell'elenco sarà ancora più piacevole.
var points = new List<Tuple<int, int, int>>
{
(0, 0, 0),
(1, 2, 3),
(-1, 12, -73),
};
Ma invece di affrontare tutti questi problemi, potrebbe essere meglio passare all'utilizzo ValueTuple
esclusivo.
var points = new List<(int, int, int)>
{
(0, 0, 0),
(1, 2, 3),
(-1, 12, -73),
};