2009-06-25 4 views
50

使用して一覧から提供されたインデックスの範囲内の値を選択する方法:次acheiveし、私はそれを使用しようとしてLINQの初心者ですLINQ

私はint型のリストを持っている: -

List<int> intList = new List<int>(new int[]{1,2,3,3,2,1}); 

ここでは、最初の3つの要素[インデックス範囲0-2]と最後の3つ[インデックス範囲3〜5]の合計をLINQを使って比較したいと思います。私はあまりにも拡張メソッドが含まれていますが、それは取得するために見ていない見LINQの選択を試してみましたが、拡張メソッドと同様にSelectManyメソッドを取るが、私は

(from p in intList 
where p in Take contiguous elements of intList from index x to x+n 
select p).sum() 

のようなものを言うする方法を見つけ出すことはできません私が欲しいもの。助言がありますか?ありがとう。

答えて

77

Skipを使用してください。

yourEnumerable.Skip(4).Take(3).Select(x=>x) 

(from p in intList.Skip(x).Take(n) select p).sum() 
+6

.GetRangeは大きなコレクションのためにかかわらず、より効率的にされるリスト注:https://でicodeit。 wordpress.com/2012/08/27/performance-of-skip-and-take-in-linq-to-objects/、http://geekswithblogs.net/BlackRabbitCoder/archive/2012/03/29/c.net -little-wonders-skip-and-take.aspx – nawfal

+0

OPはLINQについて特別に尋ねましたが、これは良い、有効なコメントです(数年前に私は回答者をupvotedしていました。あなたは再訪することはできませんあなたのソースとしてリストを保証してください。これは、単純化されたバージョンがハードコーディングされたリストであった(そして実際にはオブジェクトグラフまたはLINQ to SQLクエリのクエリかもしれません)問題の実際の問題の簡略化されたバージョンでした。 –

15

大きなリストの場合は、別の拡張メソッドを使用するとパフォーマンスが向上します。私はこれが最初のケースでは必要ではないことを知っていますが、Linq(オブジェクトへの)実装はリストを反復することに依存しているので、大きなリストではこれは(無意識的に)高価になる可能性があります。これを達成するための単純な拡張メソッドは次のようになります。

public static IEnumerable<TSource> IndexRange<TSource>(
    this IList<TSource> source, 
    int fromIndex, 
    int toIndex) 
{ 
    int currIndex = fromIndex; 
    while (currIndex <= toIndex) 
    { 
     yield return source[currIndex]; 
     currIndex++; 
    } 
} 
+0

ありがとう、あなたは私の一日を作った! –

26

あなたはGetRangeを(使用することができます)

list.GetRange(index, count); 
+1

この機能はどこにありますか? .NET 4.5または何か? –

+4

@AdamNofsingerこれはSystem.Collections.Generic名前空間の下にあります。それは.Net 2.0に付属しています。 http://msdn.microsoft.com/en-us/library/21k0e39c(v=vs.80).aspx – Onuralp