当前位置 : 主页 > 编程语言 > c语言 >

c# – 从IEnumerable中的倒数第二项跳过

来源:互联网 收集:自由互联 发布时间:2021-06-25
我有一个IEnumerable(不是List),如下面的列表: A,B,C,D,E 使用下面的命令,我将跳过最后一项(E): items_split.Take(items_split.Count() - 1); //output : A,B,C,D 通过以下命令,我将跳过第一项(A): items_spli
我有一个IEnumerable(不是List),如下面的列表:

A,B,C,D,E

使用下面的命令,我将跳过最后一项(E):

items_split.Take(items_split.Count() - 1);  //output : A,B,C,D

通过以下命令,我将跳过第一项(A):

items_split.Skip(1); //output : B,C,D,E

我如何跳过列表中的倒数第二项? (期望的结果是A,B,C,E)

注意:不是最后一个,而是紧接在最后一个之前.

让我们利用items_split是List< T>的事实. – 我们可以使用Count:

var result = items_split
  .Where((value, index) => index != items_split.Count() - 2);

在一般情况下(当items_split是IEnumerable< T>时,只有Count可能过于昂贵甚至是错误的,例如,如果您查询可在Count之后更改的文件):

public static IEnumerable<T> ExcludePenultimate<T>(IEnumerable<T> source) {
  if (null == source)
    throw new ArgumentNullException(nameof(source));

  Queue<T> queue = new Queue<T>();

  foreach (var item in source) {
    queue.Enqueue(item);

    if (queue.Count > 2) 
      yield return queue.Dequeue();
  }

  if (queue.Count > 2)
    yield return queue.Dequeue();

  if (queue.Count == 2)
    queue.Dequeue();

  yield return queue.Dequeue();
}

然后

var result = ExcludePenultimate(items_split);
网友评论