【问题标题】:How to search LinkedList<T> collection?如何搜索 LinkedList<T> 集合?
【发布时间】:2013-11-13 12:29:36
【问题描述】:

我有一个LinkedList&lt;T&gt; 对象,其中 T 是一个具有名为 ID 的属性的任意对象。我想使用 ID 作为搜索条件来搜索我的收藏。

现在我知道我可以使用 while 循环来搜索它:

LinkedListNode<MyObject> element = myObject.First;
while (element != myObject.Last)
{
    if (element.Value.ID == myID)
    break;

    element = element.Next;
}

但我想知道是否有更优雅的解决方案。请注意,我需要LinkedListNode&lt;T&gt; 才能从那里导航列表。

【问题讨论】:

  • 到目前为止,没有一个答案是好的。如果您想有效地执行此操作,请在循环中使用yield。如果您想在没有大量代码的情况下调用它,请使用它制作一个扩展方法。您将以一种或另一种方式迭代集合。

标签: c# linq generics


【解决方案1】:

您可以编写一个扩展方法来获取节点序列并进行搜索:

public static IEnumerable<LinkedListNode<T>> Nodes<T>(this LinkedList<T> list)
{
    for (var node = list.First; node != null; node = node.Next)
    {
        yield return node;
    }
}

那你就可以了

var matchingNode = list.Nodes().FirstOrDefault(n => n.Value.Id == myId);

【讨论】:

  • 这看起来不可读。经过我的编辑,早期版本更好。这种方法有什么原因吗?
  • 如何从LinkedList 获取IEnumerable&lt;LinkedListNode&lt;T&gt;&gt; 以便调用此方法?
  • @KeithPayne - 我不明白你的问题 - Nodes 从链接列表中返回 IEnumerable&lt;LinkedListNode&lt;T&gt;&gt;
  • @SriramSakthivel - 抱歉,我和你同时编辑,没有意识到Last.Next 可以为空,如果列表不为空。
  • 你不需要检查list.Count
【解决方案2】:

与 Lee 的想法相同,但代码更简单:

    public static IEnumerable<LinkedListNode<T>> Nodes<T>(this LinkedList<T> list)
    {
        var node = list.First;
        while (node != null)
        {
            yield return node;
            node = node.Next;
        }
    }

编辑

无需使用 LINQ 或扩展方法。只需使用 .Find() - 它返回一个 LinkedListNode

var node = list.Find(5);

注意:要使您的模型与 id 一起工作,需要覆盖 object.Equals 以比较 ID(因此 object.GetHashCode)

【讨论】:

  • Find(T) 方法需要一个我没有的 MyObject 引用。
【解决方案3】:

这会得到你期望的结果吗?

使用@MartinLiversage 答案并将其扩展为使用Find 方法,该方法是LinkedList&lt;T&gt; 的一部分

int id = 1;
LinkedListNode<IHaveID> nodes = null;
LinkedList<IHaveID> testList = new LinkedList<IHaveID>();

var item = testList.FirstOrDefault(x => x.ID == id);
if(item != null)
{
    nodes = testList.Find(item);
}

【讨论】:

  • 它是正确的,但它迭代列表两次,这不是最佳的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-11-08
  • 2016-02-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-12
  • 2014-12-24
相关资源
最近更新 更多