C # 6 menambahkan fitur baru hanya untuk ini: ekstensi Tambahkan metode. Ini selalu dimungkinkan untuk VB.net tetapi sekarang tersedia dalam C #.
Sekarang Anda tidak perlu menambahkan Add()
metode ke kelas secara langsung, Anda dapat menerapkannya sebagai metode ekstensi. Saat memperluas jenis enumerable apa pun dengan Add()
metode, Anda akan dapat menggunakannya dalam ekspresi initializer koleksi. Jadi, Anda tidak harus menurunkan daftar lagi secara eksplisit ( seperti yang disebutkan dalam jawaban lain ), Anda dapat memperpanjangnya.
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...
}
Ini akan memungkinkan Anda untuk melakukan ini pada kelas apa pun yang mengimplementasikan 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 },
};
Tentu saja Anda tidak dibatasi untuk memperluas koleksi tupel, itu bisa untuk koleksi jenis tertentu yang Anda inginkan untuk sintaks khusus.
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 akan menambahkan dukungan untuk tuple yang dibangun ke dalam bahasa, meskipun mereka akan dari jenis yang berbeda ( System.ValueTuple
sebagai gantinya). Jadi, sebaiknya tambahkan kelebihan untuk tuple nilai sehingga Anda memiliki opsi untuk menggunakannya juga. Sayangnya, tidak ada konversi implisit yang ditentukan di antara keduanya.
public static class ValueTupleListExtensions
{
public static void Add<T1, T2>(this IList<Tuple<T1, T2>> list,
ValueTuple<T1, T2> item) => list.Add(item.ToTuple());
}
Dengan cara ini, inisialisasi daftar akan terlihat lebih bagus.
var points = new List<Tuple<int, int, int>>
{
(0, 0, 0),
(1, 2, 3),
(-1, 12, -73),
};
Tetapi alih-alih melalui semua masalah ini, mungkin lebih baik beralih ke menggunakan ValueTuple
secara eksklusif.
var points = new List<(int, int, int)>
{
(0, 0, 0),
(1, 2, 3),
(-1, 12, -73),
};