71

私はLINQの初心者で、それを使用して次のことを達成しようとしています:

私はintのリストを持っています:-

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

ここで、LINQ を使用して、最初の 3 つの要素 [インデックス範囲 0 ~ 2] と最後の 3 つの要素 [インデックス範囲 3 ~ 5] の合計を比較します。LINQ Select および Take 拡張メソッドと SelectMany メソッドを試しましたが、次のような言い方がわかりません

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

私も Contains 拡張メソッドを見ましたが、それは私が望むものを得ることができません。助言がありますか?ありがとう。

4

5 に答える 5

107

スキップしてからテイクを使用します。

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

(from p in intList.Skip(x).Take(n) select p).sum()
于 2009-06-25T03:54:25.127 に答える
40

GetRange() を使用できます

list.GetRange(index, count);
于 2013-07-10T11:11:16.723 に答える
18

より大きなリストの場合、別の拡張メソッドの方がパフォーマンスに適している場合があります。これは最初のケースでは必要ないことはわかっていますが、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++;
    }
}
于 2011-06-05T21:07:03.750 に答える