2012-02-17 5 views
5

perlでは、スプライス関数は既存の配列から新しい項目の配列を返し、同時にこれらの項目を既存の配列から削除します。コレクションのスプライス

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

@newarray@oldarrayから250件のレコードが含まれていると@oldarrayは250件のレコードが少ないでしょう。

同様の機能を持つC#コレクションクラス、つまりArray、List、Queue、Stackに相当するものはありますか?これまでのところ、2つのステップが必要なソリューションのみを見てきました(return + remove)。

だけ Stack.Pop()とあり
[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コレクションクラスには直接的な同等物はありません。もちろん、+ removeを返す独自のヘルパーメソッドを書くこともできます。どのようにしてこの方法を使うつもりですか?おそらくPerlからパターンを運ぶのではなく、C#ishという方法があります。 – dtb

+1

ありがとうございます - スプライン関数をリストに追加する拡張メソッドを作成しました。これはIEnumerablesをサポートするためにさらに一般化される可能性があります。 – SADeveloper

+0

'Source.GetRange(Start、Size)'によって 'Source.Skip(Start).Take(Size).ToList ()'を置き換えることができます。 – Henrik

答えて

0

: - 成功し、次のユニットテストでは

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()これは1つのアイテムを返し、削除しますが、複数のアイテムは返しません。

この動作が必要な場合は、この動作を作成する必要がありますが、上記のいずれかを単にラップすることもできます。しかし、ユーザーが使用可能な要素数より多い数またはゼロ以下の数を定義する場合、何が起こるかを定義する必要があります。

2

拡張子を含むSpliceメソッドを実装できます。このメソッドは、単に範囲(参照されたオブジェクトのリスト内のコピー)を取得した後、そのオブジェクトをリストから削除します。

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

にスプライス要素の数は、リスト内の要素の数、次に大きい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; 
     } 
    }