C # 6 เพิ่มคุณสมบัติใหม่เพียงแค่นี้: ส่วนขยายเพิ่มวิธีการ สิ่งนี้เป็นไปได้สำหรับ 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));
}
// and so on...
}
นี้จะช่วยให้คุณสามารถทำเช่นนี้ในระดับใด ๆ ที่ดำเนินการ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 },
};
แน่นอนว่าคุณไม่ได้ จำกัด การขยายคอลเลกชันของ tuples มันอาจเป็นคอลเลกชันประเภทเฉพาะที่คุณต้องการไวยากรณ์พิเศษ
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 จะเพิ่มการสนับสนุนสำหรับ tuples ที่สร้างขึ้นในภาษาแม้ว่าจะเป็นประเภทอื่น ( System.ValueTuple
แทน) ดังนั้นจะเป็นการดีที่จะเพิ่มการโอเวอร์โหลดสำหรับค่า tuples เพื่อให้คุณมีตัวเลือกในการใช้เช่นกัน น่าเสียดายที่ไม่มีการแปลงที่กำหนดโดยนัยระหว่างทั้งสอง
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),
};