如何搜索LinkedList <t>集合?</t>

时间:2013-11-13 12:29:36

标签: c# linq generics

我有一个LinkedList<T>对象,其中T是一个具有名为ID的属性的任意对象。我希望使用ID作为搜索条件搜索我的收藏。

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

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

    element = element.Next;
}

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

3 个答案:

答案 0 :(得分:18)

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

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);

答案 1 :(得分:4)

与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);

注意:要使用此功能,您的模型必须覆盖object.Equals以比较ID(因此对象.GetHashCode)

答案 2 :(得分:0)

这会给出你期望的结果吗?

使用@MartinLiversage答案并将其展开以使用属于Find

LinkedList<T>方法
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);
}