C # 6 sadece bunun için yeni bir özellik ekler: uzantı Yöntem ekle. Bu VB.net için her zaman mümkün olmuştur ancak şimdi C # 'da mevcuttur.
Artık Add()
sınıflarınıza doğrudan yöntem eklemek zorunda değilsiniz, bunları uzantı yöntemleri olarak uygulayabilirsiniz. Herhangi bir numaralandırılabilir türü bir Add()
yöntemle genişletirken , bunu koleksiyon başlatıcı ifadelerinde kullanabilirsiniz. Dolayısıyla, artık listelerden açıkça türemek zorunda değilsiniz ( başka bir cevapta belirtildiği gibi ), basitçe genişletebilirsiniz.
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...
}
Bu, bunu uygulayan herhangi bir sınıfta yapmanızı sağlar 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 },
};
Elbette tuples koleksiyonlarını genişletmekle sınırlı değilsiniz, özel sözdizimini istediğiniz herhangi bir türden koleksiyonlar için olabilir.
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, dilde yerleşik olan tuples için destek ekleyecek, ancak bunlar farklı bir tür olacak ( System.ValueTuple
bunun yerine). Bu nedenle, değer kümeleri için aşırı yükler eklemek iyi olur, böylece bunları da kullanma seçeneğiniz vardır. Ne yazık ki, ikisi arasında tanımlanmış örtük dönüşüm yoktur.
public static class ValueTupleListExtensions
{
public static void Add<T1, T2>(this IList<Tuple<T1, T2>> list,
ValueTuple<T1, T2> item) => list.Add(item.ToTuple());
}
Bu şekilde liste başlatma daha da güzel görünecektir.
var points = new List<Tuple<int, int, int>>
{
(0, 0, 0),
(1, 2, 3),
(-1, 12, -73),
};
Ancak tüm bu sorunlardan geçmek yerine, sadece kullanmaya geçmek daha iyi olabilir ValueTuple
.
var points = new List<(int, int, int)>
{
(0, 0, 0),
(1, 2, 3),
(-1, 12, -73),
};