C # 6 ajoute une nouvelle fonctionnalité juste pour cela: extension Ajouter des méthodes. Cela a toujours été possible pour VB.net mais est maintenant disponible en C #.
Maintenant, vous n'avez plus besoin d'ajouter Add()
directement des méthodes à vos classes, vous pouvez les implémenter en tant que méthodes d'extension. Lorsque vous étendez un type énumérable avec une Add()
méthode, vous pourrez l'utiliser dans des expressions d'initialisation de collection. Vous n'avez donc plus besoin de dériver de listes explicitement ( comme mentionné dans une autre réponse ), vous pouvez simplement l'étendre.
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...
}
Cela vous permettra de le faire sur n'importe quelle classe qui implémente 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 },
};
Bien sûr, vous n'êtes pas limité à l'extension des collections de tuples, cela peut être pour les collections de tout type spécifique pour lequel vous voulez la syntaxe spéciale.
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 ajoutera le support des tuples intégrés dans le langage, bien qu'ils soient d'un type différent (à la System.ValueTuple
place). Il serait donc bon d'ajouter des surcharges pour les tuples de valeur afin que vous ayez la possibilité de les utiliser également. Malheureusement, aucune conversion implicite n'est définie entre les deux.
public static class ValueTupleListExtensions
{
public static void Add<T1, T2>(this IList<Tuple<T1, T2>> list,
ValueTuple<T1, T2> item) => list.Add(item.ToTuple());
}
De cette façon, l'initialisation de la liste sera encore plus agréable.
var points = new List<Tuple<int, int, int>>
{
(0, 0, 0),
(1, 2, 3),
(-1, 12, -73),
};
Mais au lieu de passer par tous ces problèmes, il serait peut-être préférable de passer à l'utilisation ValueTuple
exclusive.
var points = new List<(int, int, int)>
{
(0, 0, 0),
(1, 2, 3),
(-1, 12, -73),
};