C # 6 thêm một tính năng mới chỉ dành cho điều này: tiện ích mở rộng Thêm phương thức. Điều này luôn có thể có đối với VB.net nhưng hiện đã có trong C #.
Bây giờ bạn không phải thêm Add()
trực tiếp các phương thức vào các lớp của mình, bạn có thể triển khai chúng như các phương thức mở rộng. Khi mở rộng bất kỳ loại vô số nào bằng một Add()
phương thức, bạn sẽ có thể sử dụng nó trong các biểu thức khởi tạo bộ sưu tập. Vì vậy, bạn không phải xuất phát từ danh sách một cách rõ ràng nữa ( như đã đề cập trong câu trả lời khác ), bạn chỉ cần mở rộng nó.
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...
}
Điều này sẽ cho phép bạn làm điều này trên bất kỳ lớp nào thực hiện 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 },
};
Tất nhiên, bạn không bị hạn chế mở rộng các bộ sưu tập các bộ dữ liệu, nó có thể dành cho các bộ sưu tập thuộc bất kỳ loại cụ thể nào bạn muốn cú pháp đặc biệt.
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 sẽ được thêm hỗ trợ cho các bộ dữ liệu được tích hợp vào ngôn ngữ, mặc dù chúng sẽ thuộc loại khác ( System.ValueTuple
thay vào đó). Vì vậy, sẽ rất tốt nếu thêm quá tải cho các bộ giá trị để bạn có tùy chọn sử dụng chúng. Thật không may, không có chuyển đổi ngầm định nghĩa giữa hai.
public static class ValueTupleListExtensions
{
public static void Add<T1, T2>(this IList<Tuple<T1, T2>> list,
ValueTuple<T1, T2> item) => list.Add(item.ToTuple());
}
Bằng cách này, việc khởi tạo danh sách sẽ trông đẹp hơn nữa.
var points = new List<Tuple<int, int, int>>
{
(0, 0, 0),
(1, 2, 3),
(-1, 12, -73),
};
Nhưng thay vì trải qua tất cả những rắc rối này, có lẽ tốt hơn là chuyển sang sử dụng ValueTuple
độc quyền.
var points = new List<(int, int, int)>
{
(0, 0, 0),
(1, 2, 3),
(-1, 12, -73),
};