Nei*_*ilD 8 c# linq ienumerable
我需要从IEnumerable中获取一个元素,然后返回自身以及两侧的一系列元素.
所以,像这样:
var enumerable = new[] {54, 107, 24, 223, 134, 65, 36, 7342, 812, 96, 106};
var rangeSize = 2;
var range = enumerable.MySelectRange(x => x == 134, rangeSize);
Run Code Online (Sandbox Code Playgroud)
会返回类似的东西{ 24, 223, 134, 65, 36 }.
(该项目使用.Net 3.5)
编辑 好的,人们似乎被挂起了一堆整体.我已经改变了这个例子,希望能让我更清楚自己追求的是什么.
请记住,这不一定是一个IEnumerable<int>,但实际上是一个IEnumerable<TSomething>.
此扩展方法查找序列中满足给定谓词的第一个元素,然后返回该元素及其一定数量的相邻元素.它处理最终案例.
public static IEnumerable<T> FirstAndNeighbours<T>(
this IEnumerable<T> source,
Func<T,bool> predicate,
int numOfNeighboursEitherSide)
{
using (var enumerator = source.GetEnumerator())
{
var precedingNeighbours = new Queue<T>(numOfNeighboursEitherSide);
while(enumerator.MoveNext())
{
var current = enumerator.Current;
if (predicate(current))
{
//We have found the first matching element. First, we must return
//the preceding neighbours.
foreach (var precedingNeighbour in precedingNeighbours)
yield return precedingNeighbour;
//Next, return the matching element.
yield return current;
//Finally, return the succeeding neighbours.
for (int i = 0; i < numOfNeighboursEitherSide; ++i)
{
if (!enumerator.MoveNext())
yield break;
yield return enumerator.Current;
}
yield break;
}
//No match yet, keep track of this preceding neighbour.
if (precedingNeighbours.Count >= numOfNeighboursEitherSide)
precedingNeighbours.Dequeue();
precedingNeighbours.Enqueue(current);
}
}
}
Run Code Online (Sandbox Code Playgroud)