首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

从IEnumerable获取头部和尾部,只能迭代一次

从IEnumerable获取头部和尾部,只能迭代一次的问题,可以通过以下方式解决:

  1. 使用LINQ的扩展方法:
    • 头部:使用FirstOrDefault()方法获取第一个元素。
    • 尾部:使用Skip(1)方法跳过第一个元素,然后使用ToList()方法将剩余元素转换为列表。

示例代码:

代码语言:csharp
复制

var enumerable = GetEnumerable(); // 获取IEnumerable对象

var head = enumerable.FirstOrDefault();

var tail = enumerable.Skip(1).ToList();

代码语言:txt
复制
  1. 自定义扩展方法:
    • 头部:创建一个扩展方法GetHead(),在方法内部使用foreach循环迭代一次,返回第一个元素。
    • 尾部:创建一个扩展方法GetTail(),在方法内部使用Skip(1)方法跳过第一个元素,然后返回剩余元素的IEnumerable

示例代码:

代码语言:csharp
复制

public static class EnumerableExtensions

{

代码语言:txt
复制
   public static T GetHead<T>(this IEnumerable<T> enumerable)
代码语言:txt
复制
   {
代码语言:txt
复制
       foreach (var item in enumerable)
代码语言:txt
复制
       {
代码语言:txt
复制
           return item;
代码语言:txt
复制
       }
代码语言:txt
复制
       throw new InvalidOperationException("Sequence contains no elements.");
代码语言:txt
复制
   }
代码语言:txt
复制
   public static IEnumerable<T> GetTail<T>(this IEnumerable<T> enumerable)
代码语言:txt
复制
   {
代码语言:txt
复制
       return enumerable.Skip(1);
代码语言:txt
复制
   }

}

var enumerable = GetEnumerable(); // 获取IEnumerable对象

var head = enumerable.GetHead();

var tail = enumerable.GetTail().ToList();

代码语言:txt
复制

这样,通过以上两种方式,你可以从IEnumerable获取头部和尾部,只需要迭代一次。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

.NET面试题系列 - IEnumerable的派生类

Pop只能从栈顶取走数据。 堆栈的另外一种基本操作就是察看栈顶的数据项。Pop 操作会返回栈顶的数据项,但是此操作也会把此数据项堆栈中移除。...集合的成员都是唯一的,不会出现超过一次。 HashSetSortedSet 前者是不含值的字典,后者是不含值的SortedDictionary。...替代作为返回类型 IQueryable 通过IndexOf IEnumerable 远端获得筛选之后的资料,IEnumerable不同,IQueryable返回所有资料然后才进行筛选...它赋予集合迭代的能力。迭代是指集合的头部,一个一个将元素拿出来,直到全部拿完为止的操作。迭代不能倒车,只能前进。IEnumerable迭代器模式的实现。...双向链表保证了插入删除在尾部发生时速度和在头部一样快。 当集合元素未知,且经常存在插入或删除的动作时,考虑使用LinkedList取代List。

1.7K20
  • Java 集合深入理解(11):LinkedList

    LinkedList 的方法 1.关键的几个内部方法(头部添加删除,尾部添加删除,获取指定节点,指定节点的添加删除) //插入到头部 private void linkFirst(E e) {...i = 0; i < index; i++) x = x.next; return x; } else { //大于 size 一半,尾部倒着遍历...= node(index); E oldVal = x.item; x.item = element; return oldVal; } 4.公开的查询方法: //挨个遍历,获取一次出现位置...,名叫 ListItr 迭代器 1.DescendingIterator 倒序迭代器 //很简单,就是游标直接在 迭代尾部,然后颠倒黑白,说是向后遍历,实际是向前遍历 private class DescendingIterator...使用 Spliterator 每次可以处理某个元素集合中的一个元素 — 不是 Spliterator 中获取元素,而是使用 tryAdvance() 或 forEachRemaining() 方法对元素应用操作

    78170

    【C++】STL梳理

    通过迭代器的协助,我们只需撰写一次算法,就可以将它应用于任意容器之上,这是因为所有容器的迭代器都提供一致的接口。 STL 的基本观念就是将数据操作分离。...(优点) 总结:相当于可拓展的数组(动态数组),随机访问快,在头部中间插入或删除效率低,但在尾部插入或删除效率高,适用于对象简单,变化较小,并且频繁随机访问的场景。...0x41 特点 一旦要在 deque 的头部尾部增加新空间,便配置一段定量连续空间,串在整个 deque 的头部尾部,因此不论在头部尾部插入元素都十分迅速。...(优点) 总结:由红黑树实现,其内部元素依据其值自动排序,每个元素值只能出现一次,不允许重复,且插入删除效率比用其他序列容器高,适用于经常查找一个元素是否在某集合中且需要排序的场景。...总结:元素为键值对,key value 可以是任意你需要的类型,每个元素都有一个键,且只能出现一次,不允许重复,根据 key 快速查找记录,适用于需要存储一个数据字典,并要求方便地根据key找value

    69021

    Java集合框架(四)—— Queue、LinkedList、PriorityQueue

    队列的头部保存在队列中时间最长的元素,队列的尾部保存在队列中时间最短的元素。新元素插入(offer)到队列的尾部,访问元素(poll)操作会返回队列头部的元素。...Object element();       //获取队列头部的元素,但是不删除该元素。 boolean offer(Object e); //将指定元素加入此队列的尾部。...Object peek();           //获取队列头部的元素,但是不删除该元素,如果此队列为空,则返回null。...Object remove();      //获取队列头部的元素,并删除该元素。 Queue有两个常用的实现类:LinkedListPriorityQueue,下面分别介绍这两个实现类。...removeLastOccurrence(Object e);    //删除该双向队列的最后一次的出现元素e   以上方法可以看出,LinkedList不仅可以当成双向队列使用,也可以当成“栈”使用

    1.7K60

    【C++】STL 容器 - list 双向链表容器 ② ( list 常用 api 简介 | 首尾 添加 删除 元素 | 获取首尾元素 | 正向迭代与反向迭代 )

    提供了 push_back、pop_back、push_front pop_front 等一系列用于操作列表元素的成员函数 , 函数原型如下 : 头部插入元素 : 在容器的头部插入 val 引用指向的值...(); // 删除尾部元素 lstInt.pop_back(); 上述函数都接受常量引用作为参数( 对于 push_back push_front )或 没有参数(对于 pop_back pop_front...二、迭代器遍历容器 1、正向迭代与反向迭代 std::list 双向链表容器 提供了 begin、end、rbegin rend 这几个成员函数,用于 获取 迭代访问链表中的元素 的 迭代器 , 函数原型如下...返回一个迭代器 , 指向链表的尾部 , 该尾部指的是 超出链表末尾 的位置 , 不是最后一个元素 , 是最后一个元素后面的位置 , 无法获取值 ; iterator end(); const_iterator...end() const; 获取指向尾元素的反向迭代器 : 该函数返回一个反向迭代器 , 指向链表的最后一个元素 ; 如果链表为空 , 则此操作未定义 ; 反向迭代链表的尾部头部移动 ; 获取指向首元素之前的反向迭代

    30210

    LinkedList源码解析

    ,也可以把新加入的节点添加添加到链表尾部,add 方法默认是尾部开始添加,addFirst 方法是从头部开始添加,下面分别来看下两种不同的添加方式: **尾部添加(add)** ```java //...last = newNode; //如果链表为空(l 是尾节点,尾节点为空,链表即空),头部尾部是同一个节点,都是新建的节点 if (l == null) first...newNode; //上一个头节点的前一个节点指向当前节点 else f.prev = newNode; size++; modCount++; } ``` 头部添加节点尾部添加节点非常类似...2.2 删除节点 节点删除的方式添加类似,我们可以选择从头部删除,也可以选择尾部删除,删除操作会把节点的值,前后指向节点都置为 null,帮助 GC 进行回收。...,并且是第一次迭代,并且要删除最后一个元素的情况下 // 这种情况下,previous() 方法里面设置了 lastReturned = next = last,所以 next lastReturned

    32510

    面试官系统精讲Java源码及大厂真题 - 06 LinkedList 源码解析

    ,还是追加到链表尾部,add 方法默认是尾部开始追加,addFirst 方法是从头部开始追加,我们分别来看下两种不同的追加方式: 尾部追加(add) // 尾部开始追加节点 void linkLast...    last = newNode;     //如果链表为空(l 是尾节点,尾节点为空,链表即空),头部尾部是同一个节点,都是新建的节点     if (l == null)        ...newNode;     //上一个头节点的前一个节点指向当前节点     else         f.prev = newNode;     size++;     modCount++; } 头部追加节点尾部追加节点非常类似...2.2 节点删除 节点删除的方式追加类似,我们可以选择从头部删除,也可以选择尾部删除,删除操作会把节点的值,前后指向节点都置为 null,帮助 GC 进行回收。...Java 新增了一个迭代接口,叫做:ListIterator,这个接口提供了向前向后的迭代方法,如下所示: 迭代顺序 方法 尾到头迭代方法 hasPrevious、previous、previousIndex

    35843

    Java–LinkedList真的比ArrayList添加元素快?Open JDK JMH带你揭开真相「建议收藏」

    会抛ConcurrentModificationException异常,原因是集合修改次数modCount迭代器期望修改次数expectedModCount不一致 foreach循环相当于迭代器,在迭代器遍历中...java.io.Serializable ⭐底层数据结构是双向链表,在头部尾部添加、删除元素效率比较高,非线程安全 ⭐JDK1.7后Entry header属性被替换为Node first...指定位置添加元素,如果是添加元素到链表头部尾部,都不需要先查找节点,直接通过头部尾部节点,创建新节点变换指针指向新节点,但是如果是add(int index,E element)添加元素到非首尾位置...都是迭代器,都可以用来遍历对应的实现类 Iterator允许遍历所有实现Iterator接口的实现类,而ListIterator只能遍历List集合 两者都有hasNext()、next()、remove...从前往后或后往前遍历查找)查找到该位置的元素,当指定的位置元素刚好是中间时,二分查找发挥的作用最小,效率比较低~~ 本文JHM测试主要验证默认添加元素(尾部添加元素),至于头部及中间添加元素的效率对比

    53820

    C++初阶:容器(Containers)list常用接口详解

    介绍完了vector类的相关内容后,接下来进入新的篇章,容器list介绍: 1.list的初步介绍 list是可以在常数范围内在任意位置进行插入删除的序列式容器,并且该容器可以前后双向迭代。...list与forward_list非常相似:最主要的不同在于forward_list是单链表,只能朝前迭代,已让其更简单高效。...与其他序列式容器相比,listforward_list最大的缺陷是不支持任意位置的随机访问,比如:要访问list的第6个元素,必须已知的位置(比如头部或者尾部)迭代到该位置,在这段位置上迭代需要线性的时间开销...} int main() { test1(); return 0; } 3.list迭代器( iterator ) 迭代器 说明 begin 获取第一个数据位置的iterator/const_iterator...end 获取最后一个数据的下一个位置的iterator/const_iterator rbegin 获取最后一个数据位置的reverse_iterator rend 获取第一个数据前一个位置的reverse_iterator

    24310

    C#集合类型大揭秘

    如果某个类型实现了IEnumerable接口,就意味着它可以被迭代访问,也就可以称之为集合类型(可枚举)。...IEnumerable接口定义非常简单,只有一个GetEnumerator()方法用于获取IEnumerator类型的迭代器。...我们可以将迭代器想象成数据库的游标,即序列(集合)中的某个位置,迭代只能在序列(集合)中向前移动。...每调用一次MoveNext(),如果序列(集合)中还有下一个元素,则迭代器移动到下一个元素;Current用于获取序列(集合)中的当前元素;因为迭代器调用一次代码只需要获取一个元素,这意味着我们需要确定访问到了序列...ICollectionICollection 第一张图中,我们可以得知**ICollection继承于IEnumerable接口,并且扩展了IEnumerable**接口。

    1.2K70

    C#集合类型大揭秘

    IEnumerable接口定义非常简单,只有一个GetEnumerator()方法用于获取IEnumerator类型的迭代器。 ?...我们可以将迭代器想象成数据库的游标,即序列(集合)中的某个位置,迭代只能在序列(集合)中向前移动。...每调用一次MoveNext(),如果序列(集合)中还有下一个元素,则迭代器移动到下一个元素;Current用于获取序列(集合)中的当前元素;因为迭代器调用一次代码只需要获取一个元素,这意味着我们需要确定访问到了序列...ICollectionICollection 第一张图中,我们可以得知ICollection继承于IEnumerable接口,并且扩展了IEnumerable接口。 ?...Dictionary之所以能实现快速查找元素,其内部使用哈希表来存储元素对应的位置,我们可以通过哈希值快速地哈希表中定位元素所在的位置索引,从而快速获取到key对应的Value值。

    1.5K40

    LinkedList源码分析(基于Java8)内部结构构造方法添加2检索3删除4迭代器5 例子6总结

    LinkedList是一个实现了List接口Deque接口的双端链表 有关索引的操作可能从链表头开始遍历到链表尾部,也可能从尾部遍历到链表头部,这取决于看索引更靠近哪一端。....)); iterator()listIterator()返回的迭代器都遵循fail-fast机制。...内部结构 LinkedList内部是一个双端链表的结构 LinkedList的结构 从上图可以看出,LinkedList内部是一个双端链表结构,有两个变量,first指向链表头部,last指向链表尾部。...,也可以将元素添加到指定索引位置,还可以添加添加整个集合;另外既可以在头部添加,又可以在尾部添加。...next()返回当前节点的值并将next指向其后继节点 previous()返回当前节点的前一个节点的值并将next节点指向其前驱节点 由于Node是一个双端节点,所以这儿用了一个节点就可以实现从前向后迭代后向前迭代

    95540

    ConcurrentLinkedQueue 源码解读

    一、介绍 ConcurrentLinkedQueue 是一个基于链接节点的无界线程安全队列,它采用先进先出的规则对节点进行排序,当我们添加一个元素的时候,它会添加到队列的尾部;当我们获取一个元素时,它会返回队列头部的元素...重新读取一次 tail 到快照 t。如果 t 发生变化,则从新的 tail 节点继续下去(注意这里的设值 for 循环中的初始值一样,表明重新开始,继续尝试)。...如果 p 与 t 相等,说明 p 不是尾节点,则让 p 继续向后移动一个节点; 如果 p t 不相等,则说明已经经历至少两轮循环(仍然没有入队), 则重新读取一次 tail 到 t,p = t(上面...,则返回 true Iterator iterator() 返回此队列中元素的迭代器,从头元素开始迭代 E peek() 检索但不删除队列的头部,如果此队列为空,则返回 null E poll() 检索并删除队列的头部...,如果此队列为空,则返回 null boolean remove(Object o) 该队列中删除指定元素的单个实例(如果存在) int size() 返回队列中元素的个数 T[] toArray(T

    88220

    C#2.0新增功能05 迭代

    下次调用迭代器函数时,将从该位置重新开始执行。 通过 foreach 语句或 LINQ 查询客户端代码中使用迭代器。   ...这是因为 IEnumerable 继承了 IEnumerable。 非泛型实现遵从泛型实现的规则。 本示例使用命名迭代器来支持通过各种方法循环访问同一数据集合。...若要从头开始重新迭代,必须获取新的迭代器。 在迭代器方法返回的迭代器上调用 Reset 会引发 NotSupportedException。 有关其他信息,请参阅 C# 语言规范。...迭代器的使用 需要使用复杂代码填充列表序列时,使用迭代器可保持 foreach 循环的简单性。 需执行以下操作时,这可能很有用: 在第一次 foreach 循环迭代之后,修改列表序列。...避免在 foreach 循环的第一次迭代之前完全加载大型列表。 一个示例是用于加载一批表格行的分页提取。

    72150
    领券