我有一个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>
才能从那里导航列表。
答案 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);
}