如何将C#的LinkedList改造为循环双向链表解决边界切换问题
解决循环双向链表切换问题
问题背景
现有基于System.Collections.Generic.LinkedList<Entry>的双向链表,Entry为存储数据库行的结构体。通过按钮切换链表节点时,无法实现循环切换:
- 在第一个节点点击上一页按钮,无法跳转到最后一个节点
- 在最后一个节点点击下一页按钮,无法跳转到第一个节点
原有按钮逻辑直接调用Previous.Value/Next.Value,当处于首尾节点时会抛出空引用异常;尝试用??运算符报错,因为Entry是值类型,??仅支持可空类型。
解决方案
核心思路是先获取当前节点的LinkedListNode<Entry>实例,判断Previous/Next是否为null,为空时切换到链表的另一端节点:
修改上一页按钮逻辑
private void previousButton() { var currentNode = items.Find(runner); // 如果当前是第一个节点,Previous为null,切换到最后一个节点 var targetNode = currentNode.Previous ?? items.Last; runner = targetNode.Value; // 更新图形元素绑定 }
修改下一页按钮逻辑
private void nextButton() { var currentNode = items.Find(runner); // 如果当前是最后一个节点,Next为null,切换到第一个节点 var targetNode = currentNode.Next ?? items.First; runner = targetNode.Value; // 更新图形元素绑定 }
注意事项
- 确保
Entry结构体正确实现了Equals和GetHashCode方法,否则items.Find(runner)可能无法找到对应的节点(结构体默认值比较为逐字段比较,若包含引用类型字段或需自定义比较逻辑,需手动重写)。 - 若链表为空,需在
Prepare方法中添加空链表判断,避免后续操作抛出空引用异常。
内容的提问来源于stack exchange,提问作者jotaro-gogogo
相关产品推荐
相关产品推荐

