c# - एक संग्रह में AddRange




collections c#-3.0 (4)

एक सहकर्मी ने आज मुझसे पूछा कि संग्रह में एक सीमा कैसे जोड़नी है। उनके पास एक वर्ग है जो Collection<T> से विरासत में मिलता है। उस प्रकार की एकमात्र संपत्ति है जिसमें पहले से ही कुछ आइटम हैं। वह संपत्ति संग्रह में किसी अन्य संग्रह में वस्तुओं को जोड़ना चाहता है। वह सी # 3-अनुकूल फैशन में ऐसा कैसे कर सकता है? (केवल प्राप्त संपत्ति के बारे में बाधा पर ध्यान दें, जो संघ को करने और पुन: असाइन करने जैसे समाधानों को रोकता है।)

निश्चित रूप से, संपत्ति के साथ एक foreach। जोड़ें काम करेगा। लेकिन एक List<T> स्टाइल AddRange कहीं अधिक सुरुचिपूर्ण होगा।

एक विस्तार विधि लिखना काफी आसान है:

public static class CollectionHelpers
{
    public static void AddRange<T>(this ICollection<T> destination,
                                   IEnumerable<T> source)
    {
        foreach (T item in source)
        {
            destination.Add(item);
        }
    }
}

लेकिन मुझे लगता है कि मैं पहिया को फिर से शुरू कर रहा हूं। मुझे System.Linq या morelinq में कुछ भी नहीं मिला।

खराब डिजाइन? बस कॉल जोड़ें? स्पष्ट याद आ रही है?


आप अपनी आईनेमरेबल रेंज को किसी सूची में जोड़ सकते हैं और फिर सूची में ICollection = सेट कर सकते हैं।

        IEnumerable<T> source;

        List<item> list = new List<item>();
        list.AddRange(source);

        ICollection<item> destination = list;

चूंकि .NET4.5 यदि आप एक-लाइनर चाहते हैं तो आप System.Collections.Generic ForEach का उपयोग कर सकते हैं।

source.ForEach(o => destination.Add(o));

या यहां तक ​​कि कम के रूप में भी

source.ForEach(destination.Add);

प्रदर्शन-वार यह प्रत्येक लूप (सिंटेक्टिक चीनी) के समान है।

इसे भी असाइन करने का प्रयास करें

var x = source.ForEach(destination.Add) 

कारण के लिए शून्य शून्य है।


याद रखें कि प्रत्येक Add संग्रह की क्षमता की जांच करेगा और आवश्यक होने पर इसे आकार देगा (धीमा)। AddRange साथ, संग्रह क्षमता निर्धारित किया जाएगा और फिर आइटम (तेज) जोड़ा जाएगा। यह विस्तार विधि बेहद धीमी होगी, लेकिन काम करेगी।


लूप चलाने से पहले एक्सटेंशन विधि में सूची में कास्ट करने का प्रयास करें। इस तरह आप List.AddRange के प्रदर्शन का लाभ उठा सकते हैं।

public static void AddRange<T>(this ICollection<T> destination,
                               IEnumerable<T> source)
{
    List<T> list = destination as List<T>;

    if (list != null)
    {
        list.AddRange(source);
    }
    else
    {
        foreach (T item in source)
        {
            destination.Add(item);
        }
    }
}




extension-methods