如何使用LINQ从List中提供的索引范围内选择值

时间:2009-06-25 03:51:28

标签: c# linq list range

我是一名LINQ新手试图用它来实现以下目标:

我有一个整体列表: -

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

现在,我想使用LINQ比较前三个元素[索引范围0-2]与最后三个[索引范围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 个答案:

答案 0 :(得分:86)

使用Skip然后选择。

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

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

答案 1 :(得分:33)

您可以使用GetRange()

list.GetRange(index, count);

答案 2 :(得分:17)

对于较大的列表,单独的扩展方法可能更适合于性能。我知道这对于初始情况不是必需的,但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++;
    }
}

答案 3 :(得分:0)

按特定索引(不是从 - 到)进行过滤:

public static class ListExtensions
{
   public static IEnumerable<TSource> ByIndexes<TSource>(this IList<TSource> source, params int[] indexes)
   {        
        if (indexes == null || indexes.Length == 0)
        {
            foreach (var item in source)
            {
                yield return item;
            }
        }
        else
        {
            foreach (var i in indexes)
            {
                if (i >= 0 && i < source.Count)
                    yield return source[i];
            }
        }
   }
}

例如:

string[] list = {"a1", "b2", "c3", "d4", "e5", "f6", "g7", "h8", "i9"};
var filtered = list.ByIndexes(5, 8, 100, 3, 2); // = {"f6", "i9", "d4", "c3"};