2012-02-17 11 views
5

perl में, splice फ़ंक्शन किसी मौजूदा सरणी से आइटम्स की एक नई सरणी देता है और साथ ही साथ इन आइटम्स को मौजूदा सरणी से हटा देता है।संग्रह पर विभाजन

my @newarry = splice @oldarray, 0, 250; 

@newarray अब @oldarray से 250 रिकॉर्ड में शामिल होंगे और @oldarray 250 रिकॉर्ड कम है।

क्या सी # संग्रह कक्षाओं यानी ऐरे, सूची, कतार, स्टैक के समान समान कार्य के बराबर है? अब तक मैंने केवल उन समाधानों को देखा है जहां दो चरणों की आवश्यकता है (वापसी + हटाएं)।

[TestClass] 
public class ListTest 
{ 
    [TestMethod] 
    public void ListsSplice() 
    { 
    var lst = new List<string>() { 
     "one", 
     "two", 
     "three", 
     "four", 
     "five" 
    }; 

    var newList = lst.Splice(0, 2); 

    Assert.AreEqual(newList.Count, 2); 
    Assert.AreEqual(lst.Count, 3); 

    Assert.AreEqual(newList[0], "one"); 
    Assert.AreEqual(newList[1], "two"); 

    Assert.AreEqual(lst[0], "three"); 
    Assert.AreEqual(lst[1], "four"); 
    Assert.AreEqual(lst[2], "five"); 

    } 
} 
+1

.NET संग्रह कक्षाओं में कोई प्रत्यक्ष समकक्ष नहीं है। आप, निश्चित रूप से, अपनी खुद की सहायक विधि लिख सकते हैं जो वापसी + हटा देता है। आप विधि का उपयोग करने का इरादा कैसे रखते हैं? शायद पर्ल से पैटर्न ले जाने की कोशिश करने के बजाय इसे करने का एक और सी # आश रास्ता है। – dtb

+1

धन्यवाद - मैंने स्प्लिस फ़ंक्शन को सूचियों में जोड़ने के लिए एक विस्तार विधि बनाई है - यह संभवत: आईनेमरेबल्स का समर्थन करने के लिए और भी सामान्यीकृत किया जा सकता है। – SADeveloper

+0

आप 'Source.Skip (प्रारंभ) को प्रतिस्थापित कर सकते हैं। टेक (आकार)। स्रोत 0G()' स्रोत 'गेट्रेंज (प्रारंभ, आकार) '। – Henrik

उत्तर

0

वहाँ केवल Stack.Pop() और है: - जो सफल होता है

public static List<T>Splice<T>(this List<T> Source, int Start, int Size) 
{ 
    List<T> retVal = Source.Skip(Start).Take(Size).ToList<T>(); 
    Source.RemoveRange(Start, Size); 
    return retVal; 
} 
निम्नलिखित यूनिट परीक्षण के साथ

: -

अद्यतन कोई कार्यक्षमता मौजूद है तो मैं ब्याह समारोह का समर्थन करने के लिए एक Extensio विधि को लागू किया है Queue.Dequeue() जो एक आइटम लौटाएगा और हटा देगा लेकिन एकाधिक नहीं।

यदि आपको इस व्यवहार की आवश्यकता है तो आपको इसे अपने लिखना होगा, लेकिन शायद आप उपरोक्त में से किसी एक को लपेट सकते हैं। लेकिन आपको परिभाषित करना चाहिए कि क्या होता है यदि उपयोगकर्ता उपलब्ध तत्वों की तुलना में अधिक संख्या या शून्य या उससे कम की संख्या को परिभाषित करता है।

2

आप एक विस्तार के साथ एक स्प्लिस विधि लागू कर सकते हैं। यह विधि बस एक सीमा प्राप्त करती है (जो सूची में संदर्भित वस्तु की एक प्रति है), फिर यह सूची से वस्तुओं को हटा देती है।

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 

namespace SpliceExample 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      List<int> numbers = new List<int> { 1, 2, 3, 4, 5, 6, 7, 8, 9 }; 

      List<int> subset = numbers.Splice(3, 3); 

      Console.WriteLine(String.Join(", ", numbers)); // Prints 1, 2, 3, 7, 8, 9 
      Console.WriteLine(String.Join(", ", subset)); // Prints 4, 5, 6 

      Console.ReadLine(); 
     } 
    } 

    static class MyExtensions 
    { 
     public static List<T> Splice<T>(this List<T> list, int index, int count) 
     { 
      List<T> range = list.GetRange(index, count); 
      list.RemoveRange(index, count); 
      return range; 
     } 
    } 
} 
0

spliced ​​तत्वों की संख्या एक सूची में बड़ा तो तत्वों की संख्या है, तो GetRange() और RemoveRange() पद्धतियों एक अपवाद फेंक देते हैं। बेहतर समाधान Skip() और Take() का उपयोग करना है और सूची आकार के लिए जांचें:

public static class ListExtension 
    { 
     public static List<T> Splice<T>(this List<T> source, int start, int size) 
     { 
      var items = source.Skip(start).Take(size).ToList<T>(); 
      if (source.Count >= size) 
       source.RemoveRange(start, size); 
      else 
       source.Clear(); 
      return items; 
     } 
    }