我是一个新手LINQ试图用它来acheive如下:
我有整数的列表: -
List<int> intList = new List<int>(new int[]{1,2,3,3,2,1});
现在,我想比较前三个元素[索引范围0-2]使用LINQ过去三年[索引范围3-5]的总和。 我尝试了LINQ选择和Take扩展方法以及该方法的SelectMany,但我无法弄清楚如何这样说
(from p in intList
where p in Take contiguous elements of intList from index x to x+n
select p).sum()
我看着包含扩展方法太,但没有看到让我我想要的。 有什么建议? 谢谢。
使用跳跃再拿。
yourEnumerable.Skip(4).Take(3).Select( x=>x )
(from p in intList.Skip(x).Take(n) select p).sum()
您可以使用GetRange()
list.GetRange(index, count);
对于较大的列表,一个单独的扩展方法可能是更适合的性能。 我知道这是没有必要的初始情况,但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++;
}
}
要通过具体指标筛选(而不是从到):
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"};