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 },
};
बेशक आप टुपल्स के संग्रह को बढ़ाने के लिए प्रतिबंधित नहीं हैं, यह किसी भी विशिष्ट प्रकार के संग्रह के लिए हो सकता है, जिसके लिए आप विशेष वाक्यविन्यास चाहते हैं।
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 भाषा में निर्मित टुपल्स के समर्थन में जोड़ रहा होगा, हालांकि वे एक अलग प्रकार ( 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),
};