IEnumerable - 返回元素两侧范围内的项目

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>.

Mat*_*lls 5

此扩展方法查找序列中满足给定谓词的第一个元素,然后返回该元素及其一定数量的相邻元素.它处理最终案例.

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)