LinkedList 上的 LINQ - 迭代 LinkedListNode,而不是 T
我在理解如何在 LINQ 中执行某些操作时遇到问题。
我有一个链表,对象的类型并不重要。重要的是我想根据当前对象与列表中下一个对象之间的关系在 Where()
中执行某些操作。
为什么我不能执行类似以下操作:
linkedlist.Where(n=>a_function(n.Value, n.Next.Value))
?
如果可能的话,执行此操作的语法是什么?类型推断系统似乎坚持认为我希望 lambda 参数为 T
,而不是 LinkedListNode
。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
您必须为链表编写新的迭代器才能做到这一点。像
这样你就可以使用
You'll have to write new iterator for linked list to do that. Something like
so you can use
您的问题与类型推断没有太大关系;
LinkedList
是IEnumerable
,而不是IEnumerable>
。此外,没有直接的方法来获取(当前,下一个)
元组序列,因此您必须自己实现。这是 LINQ 的一种(不太有效)方法:
如果谓词匹配
(value, nextValue)
,这将选择一个值。如果这不完全是您所需要的,您可能需要稍微调整一下查询。否则,如果您需要效率或者您有很多基于
(node, nextNode)
的过滤器,请使用 max 的解决方案。Your issue doesn't have much to do with type-inference;
LinkedList<T>
is anIEnumerable<T>
, not anIEnumerable<LinkedListNode<T>>
. Additionally, there isn't a direct way to get a sequence of(current, next)
tuples, so you'll have to implement that yourself.Here's one (not so efficient) way with LINQ:
This will choose a value if the predicate matches
(value, nextValue)
. You might have to tweak the query a bit if that isn't exactly what you need.Otherwise, go with max's solution if you need efficiency or if you have lots of filters that are based on
(node, nextNode)
.受到 max 答案的启发,我想出了一个较短的版本:
或者您可以牺牲可读性以获得更短的版本:
Inspired by max's answer, I came up with a shorter version:
Or you could sacrifice readability for an even shorter version: