C# 6新增了一个针对此问题的新功能:扩展Add方法。虽然VB.net一直支持,但现在也适用于C#。
现在您不必直接向类中添加Add()
方法,可以将其实现为扩展方法。当用Add()
方法扩展任何可枚举类型时,您将能够在集合初始化表达式中使用它。因此,您不再需要明确从列表中派生(如另一个答案中所述),而是可以简单地进行扩展。
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));
}
}
这将使您可以在实现 IList<>
接口的任何类上执行此操作:
Translated sentence:
这将使您可以在实现 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 },
};
当然你不仅可以扩展元组集合,还可以为任何你想要的特定类型集合使用特殊的语法。
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),
2222222222L,
3333333333UL,
{ 4, 4, 4, 4, 4, 4, 4, 4 },
"55555555555555555555555555555555555555",
};
C# 7将内置元组支持到语言中,不过它们将是不同类型的(System.ValueTuple
)。因此,最好添加值元组重载以便您也可以选择使用它们。不幸的是,在两者之间没有定义隐式转换。
public static class ValueTupleListExtensions
{
public static void Add<T1, T2>(this IList<Tuple<T1, T2>> list,
ValueTuple<T1, T2> item) => list.Add(item.ToTuple());
}
这样列表的初始化看起来会更加漂亮。
var points = new List<Tuple<int, int, int>>
{
(0, 0, 0),
(1, 2, 3),
(-1, 12, -73),
};
但是,与其费尽心思地进行所有这些操作,不如完全转而使用ValueTuple
。
var points = new List<(int, int, int)>
{
(0, 0, 0),
(1, 2, 3),
(-1, 12, -73),
};
Dictionary
СИЇтЁЂУ«ИТюЅжЄЇтцЇуџёжћ«сђѓ - Steven Jeuris