C#でコレクションのサブセットを列挙?
-
23-08-2019 - |
質問
C#でコレクションのサブセットのみを列挙するための良い方法はありますか?それは私が多数のオブジェクト(たとえば、1000)のコレクションを持って、ですが、私は唯一の要素を250列挙したいと思います - 340をコレクションのサブセットの列挙子を得るための良い方法はあり、なし別のコレクションを使用していますか?
編集:これは、.NET Framework 2.0を使用していることを言及している必要があります。
。解決
タグ以下をお試しください
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);
}
編集 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);
他のヒント
私は(あなたが、必ずしも列挙子を必要としない場合)、それをシンプルに保つために好きます:
for (int i = 249; i < Math.Min(340, list.Count); i++)
{
// do something with list[i]
}
.NET 2.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
}
再びJaradのコードを適応、この拡張子の方法は、あなたのの項目のではなく、インデックスによって定義されたサブセットを取得します。
//! Get subset of collection between \a start and \a end, inclusive
//! Usage
//! \code
//! using ExtensionMethods;
//! ...
//! var subset = MyList.GetRange(firstItem, secondItem);
//! \endcode
class ExtensionMethods
{
public static IEnumerable<T> GetRange<T>(this IEnumerable<T> source, T start, T end)
{
#if DEBUG
if (source.ToList().IndexOf(start) > source.ToList().IndexOf(end))
throw new ArgumentException("Start must be earlier in the enumerable than end, or both must be the same");
#endif
yield return start;
if (start.Equals(end))
yield break; //start == end, so we are finished here
using (var e = source.GetEnumerator())
{
while (e.MoveNext() && !e.Current.Equals(start)); //skip until start
while (!e.Current.Equals(end) && e.MoveNext()) //return items between start and end
yield return e.Current;
}
}
}
あなたはLINQので何かを行うことができるかもしれません。私はこれを行うような方法は、私はアレイIDに基づいて処理したい項目を選択することができ、配列にオブジェクトを置くことです。
あなたがリストとコレクションのスライシングとダイシングのかなりの量を行う必要があることが判明した場合、
、それは価値が<のhref = "http://www.itu.dk/research/c5に学習曲線を登ることがあります/」のrel = "nofollowをnoreferrer"> C5ジェネリックコレクションライブラリでます。
所属していません StackOverflow