のリストがありCustomClassItem
ます。取得したい項目のインデックスである int がいくつかあります。
それらを取得するための最も迅速で効率的な方法は何ですか? 複数のインデックスを持つインデックス演算子の精神にあるものか、myList.GetWhereIndexIs(myIntsList)
それとも ?
Linq を使用できます。
List<CustomClassItem> items = myIntsList.Select(i => myList[i]).ToList();
ことを確認してくださいmyIntsList.All(i => i >= 0 && i < myList.Count);
編集:
リストにインデックスが存在しない場合は、このインデックスを無視します。
List<CustomClassItem> items = myIntsList.Where(i => i >= 0 && i < myList.Count)
.Select(i => myList[i]).ToList();
yield
素敵で効率的な解決策は、拡張メソッドと組み合わせて使用 することだと思います:
public static IList<T> SelectByIndex<T>(this IList<T> src, IEnumerable<int> indices)
{
foreach (var index in indices) {
yield return src[index];
}
}
これで、次のことができます。myList.SelectByIndex(new [] { 0, 1, 4 });
params オブジェクトを使用することもできます。
public static IList<T> SelectByIndexParams<T>(this IList<T> src, params int[] indices)
{
foreach (var index in indices) {
yield return src[index];
}
}
これで、次のことができます。myList.SelectByIndexParams(0, 1, 4);
あなたが望むもの(私が正しく読んでいれば)は次のとおりです:
var indices = [ 1, 5, 7, 9 ];
list.Where((obj, ind) => indices.Contains(ind)).ToList();
これList<CustomClassItem>
により、インデックスがリストにあるすべてのアイテムを含む が得られます。
ほとんどすべての LINQ 拡張メソッドは、Tとint を受け取る関数を受け入れます。これは、Enumerable 内の T のインデックスです。本当に便利です。
を使用した別のアプローチEnumerable.Join
:
var result = myList.Select((Item, Index) => new { Item, Index })
.Join(indices, x => x.Index, index => index, (x, index) => x.Item);
より効率的で安全です (インデックスが存在することを保証します) が、他のアプローチよりも読みにくくなります。
おそらく、読みやすさと再利用性を向上させる拡張機能を作成したいと思うでしょう:
public static IEnumerable<T> GetIndices<T>(this IEnumerable<T> inputSequence, IEnumerable<int> indices)
{
var items = inputSequence.Select((Item, Index) => new { Item, Index })
.Join(indices, x => x.Index, index => index, (x, index) => x.Item);
foreach (T item in items)
yield return item;
}
次に、次のように使用できます。
var indices = new[]{ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
var first5 = myList.GetIndices(indices).Take(5);
Take
linq の遅延実行がここでも機能することを示すために使用されます。