List.AddRange()मौजूद है, लेकिन IList.AddRange()नहीं है।
यह मुझे अजीब लगता है। इसके पीछे क्या कारण है?
List.AddRange()मौजूद है, लेकिन IList.AddRange()नहीं है।
यह मुझे अजीब लगता है। इसके पीछे क्या कारण है?
जवाबों:
क्योंकि एक इंटरफ़ेस को लागू करना आसान है और इसमें "सब कुछ लेकिन रसोई" शामिल नहीं है। यदि आप जोड़ते AddRangeहैं तो आपको जोड़ना चाहिए InsertRangeऔर RemoveRange(समरूपता के लिए)। एक बेहतर सवाल यह होगा कि IList<T>इंटरफ़ेस के समान इंटरफ़ेस के लिए एक्सटेंशन विधियां क्यों नहीं हैं IEnumerable<T>। (के लिए यथा-स्थान विस्तार के तरीकों Sort, BinarySearch... उपयोगी होगा)
IFooएक "सहायक" नाम स्थान (जैसे MyAssembly) घोषित करने के लिए ऐसा है कि यदि कोई वर्ग लागू करने का दावा करता है, IFooलेकिन विधि का अभाव है int Bar(String), तो संकलक ऑटो- जेनरेट मेथड int IFoo.Bar(String p1) {return MyAssembly.ClassHelpers.IFoo.Bar(this, p1);} इस तरह की सुविधा मौजूद थी, इंटरफेस में अधिक तरीके शामिल हो सकते थे जैसे AddRangeकि आधार व्यवहार के संदर्भ में लागू किया जा सकता है, लेकिन कुछ कार्यान्वयन अनुपात अनुकूलन कर सकते हैं।
उन लोगों के लिए जो "AddRange", "सॉर्ट", ... के लिए एक्सटेंशन के तरीके चाहते हैं, IList पर,
नीचे AddRangeविस्तार विधि है:
public static void AddRange<T>(this IList<T> source, IEnumerable<T> newList)
{
if (source == null)
{
throw new ArgumentNullException(nameof(source));
}
if (newList == null)
{
throw new ArgumentNullException(nameof(newList));
}
if (source is List<T> concreteList)
{
concreteList.AddRange(newList);
return;
}
foreach (var element in newList)
{
source.Add(element);
}
}
मैंने एक छोटा पुस्तकालय बनाया जो ऐसा करता है। मुझे लगता है कि प्रत्येक परियोजना पर इसके विस्तार के तरीकों को फिर से करने की तुलना में यह अधिक व्यावहारिक है।
कुछ विधियाँ सूची की तुलना में धीमी हैं, लेकिन वे काम करते हैं।
यहाँ GitHub उन्हें ब्याज देने के लिए है:
AddRange/RemoveRange/InsertRangeसीधे "आंतरिक" संग्रह पर काम कर सकता है औरCapacityप्रबंधन का उपयोग कर सकता है औरArray.Copyडेटा के ब्लॉक के आसपास जाने के लिए तरीकों का उपयोग कर सकता है। एक विस्तार विधिRemoveRangeशायद की तुलना में धीमी magniture का आदेश होगाList.RemoveRange