13

C#でコレクションのサブセットのみを列挙する良い方法はありますか? つまり、多数のオブジェクト (たとえば 1000) のコレクションがありますが、250 ~ 340 の要素のみを列挙したいと考えています。別のコレクションを使用していますか?

編集:これは.NET Framework 2.0を使用していることに言及する必要がありました。

4

6 に答える 6

39

以下を試してください

var col = GetTheCollection();
var subset = col.Skip(250).Take(90);

またはより一般的に

public static IEnumerable<T> GetRange(this IEnumerable<T> source, int start, int end) {
  // Error checking removed
  return source.Skip(start).Take(end - start);
}

EDIT 2.0 ソリューション

public static IEnumerable<T> GetRange<T>(IEnumerable<T> source, int start, int end ) {
  using ( var e = source.GetEnumerator() ){ 
    var i = 0;
    while ( i < start && e.MoveNext() ) { i++; }
    while ( i < end && e.MoveNext() ) { 
      yield return e.Current;
      i++;
    }
  }      
}

IEnumerable<Foo> col = GetTheCollection();
IEnumerable<Foo> range = GetRange(col, 250, 340);
于 2009-05-19T20:01:36.543 に答える
3

私はそれを単純に保つのが好きです(必ずしも列挙子が必要でない場合):

for (int i = 249; i < Math.Min(340, list.Count); i++)
{
    // do something with list[i]
}
于 2009-05-19T20:08:10.180 に答える
2

Jaredの元のコードを.Net2.0に適合させる:

IEnumerable<T> GetRange(IEnumerable<T> source, int start, int end)
{
    int i = 0;
    foreach (T item in source)
    {
        i++;
        if (i>end) yield break;
        if (i>start) yield return item;
    }
}

そしてそれを使用するには:

 foreach (T item in GetRange(MyCollection, 250, 340))
 {
     // do something
 }
于 2009-05-19T20:11:21.703 に答える
0

リストとコレクションのかなりの量のスライスとダイシングを行う必要があることがわかった場合は、C5 GenericCollectionLibraryに学習曲線を登る価値があるかもしれません。

于 2009-05-19T20:05:17.317 に答える
0

Linq で何かできるかもしれません。これを行う方法は、オブジェクトを配列に入れることです。次に、配列 ID に基づいて処理する項目を選択できます。

于 2009-05-19T20:02:49.257 に答える