IList AddRange का समर्थन क्यों नहीं करता है


89

List.AddRange()मौजूद है, लेकिन IList.AddRange()नहीं है।
यह मुझे अजीब लगता है। इसके पीछे क्या कारण है?

जवाबों:


68

क्योंकि एक इंटरफ़ेस को लागू करना आसान है और इसमें "सब कुछ लेकिन रसोई" शामिल नहीं है। यदि आप जोड़ते AddRangeहैं तो आपको जोड़ना चाहिए InsertRangeऔर RemoveRange(समरूपता के लिए)। एक बेहतर सवाल यह होगा कि IList<T>इंटरफ़ेस के समान इंटरफ़ेस के लिए एक्सटेंशन विधियां क्यों नहीं हैं IEnumerable<T>। (के लिए यथा-स्थान विस्तार के तरीकों Sort, BinarySearch... उपयोगी होगा)


35
@ShdNx प्रदर्शन-वार को लागू करने के लिए वे बहुत तुच्छ नहीं हैं। एक "आंतरिक" AddRange/RemoveRange/InsertRangeसीधे "आंतरिक" संग्रह पर काम कर सकता है और Capacityप्रबंधन का उपयोग कर सकता है और Array.Copyडेटा के ब्लॉक के आसपास जाने के लिए तरीकों का उपयोग कर सकता है। एक विस्तार विधि RemoveRangeशायद की तुलना में धीमी magniture का आदेश होगाList.RemoveRange
xanatos

2
यह बहुत बुरा है कि एक इंटरफ़ेस (उदाहरण के लिए) के लिए किसी भी तरह से (और अभी भी नहीं है) IFooएक "सहायक" नाम स्थान (जैसे MyAssembly) घोषित करने के लिए ऐसा है कि यदि कोई वर्ग लागू करने का दावा करता है, IFooलेकिन विधि का अभाव है int Bar(String), तो संकलक ऑटो- जेनरेट मेथड int IFoo.Bar(String p1) {return MyAssembly.ClassHelpers.IFoo.Bar(this, p1);} इस तरह की सुविधा मौजूद थी, इंटरफेस में अधिक तरीके शामिल हो सकते थे जैसे AddRangeकि आधार व्यवहार के संदर्भ में लागू किया जा सकता है, लेकिन कुछ कार्यान्वयन अनुपात अनुकूलन कर सकते हैं।
सुपरकैट

1
उन्हें विस्तार विधियों के रूप में लागू किया जा सकता है, इस तरह से इंटरफ़ेस कार्यान्वयन उन्हें लागू नहीं करना होगा। वे क्यों नहीं हैं?
टॉम पॉज़्रुक

15
इसका कोई अर्थ नहीं निकलता। एक इंटरफ़ेस कार्यान्वयन को अमूर्त करता है, ताकि एक ही मूल सुविधाओं के कई कार्यान्वयन हो सकें; कोई कारण नहीं है कि सुविधाओं को एक इंटरफ़ेस से छोड़ा जाना चाहिए, क्योंकि "कार्यान्वयन कठिन है"। इंटरफ़ेस पर "AddRange" जैसी विधियों के बिना, कोई गारंटी नहीं है कि अंतर्निहित ऑब्जेक्ट उनका समर्थन करता है, और उस बिंदु पर आप या तो एक उप-इष्टतम एक्सटेंशन को लागू करने के लिए मजबूर होते हैं या खतरनाक मान्यताओं की कोशिश करके एक इंटरफ़ेस का उपयोग करने के उद्देश्य को पराजित करते हैं। एक विशिष्ट कार्यान्वयन वर्ग के लिए। डंबड-डाउन इंटरफेस अधिक उपयोग किया जाता है।
त्रिवेंको

3
थोक संचालन का समर्थन करने वाला IRangeList इंटरफ़ेस होना चाहिए, केवल कुछ संग्रह पर लागू किया जाता है जो आंतरिक रूप से कार्यान्वयन इष्टतम होंगे।
बहुत

8

उन लोगों के लिए जो "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 उन्हें ब्याज देने के लिए है:

IListExtension रिपॉजिटरी

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.