这是迭代.NET LinkedList并删除元素的好方法吗?

时间:2010-02-28 00:48:43

标签: c# .net iterator

我正在考虑做以下事情:

for(LinkedListNode<MyClass> it = myCollection.First; it != null; it = it.Next)
{
    if(it.Value.removalCondition == true)
        it.Value = null;
}

我想知道的是:如果简单地将it.Value指向null,实际上就会将其删除。

6 个答案:

答案 0 :(得分:9)

将it.Value设置为null不会从列表中删除该节点 这是一种方式:

    for(LinkedListNode<MyClass> it = myCollection.First; it != null; )
    {
        LinkedListNode<MyClass> next = it.Next;
        if(it.Value.removalCondition == true)
              myCollection.Remove(it); // as a side effect it.Next == null

        it = next;
    }

答案 1 :(得分:1)

当然(使用链接列表)您需要更改链接。

例如,如果你想从LL A-B-C中删除B,你需要将A的链接改为B到C.

我承认我不熟悉链接列表的.NET实现,但希望这对你来说是一个开始。

答案 2 :(得分:1)

您正在更改LinkedListNode指向的值;请注意,您的列表现在将包含一个洞(节点)。

如果您“删除”A - B - C,则代替A - null - C,您将拥有B。那是你想要实现的目标吗?

答案 3 :(得分:0)

我认为需要这样的东西

for ( LinkedListNode<MyClass> it = myCollection.First; it != null; it = it.Next ) {
  if ( it.Value.removalCondition == true ) {
    if ( it.Previous != null && it.Next != null ) {
      it.Next.Previous = it.Previous;
      it.Previous.Next = it.Next;
    } else if ( it.Previous != null )
      it.Previous.Next = it.Next;
    } else if ( it.Next != null )
      it.Next.Previous = it.Previous;
    it.Value = null;
  }
}

答案 4 :(得分:0)

如果您可以转换为使用List&lt;&gt;而不是LinkedList&lt;&gt;然后你可以使用RemoveAll()操作。通过这样的匿名代表;

List<string> list = new List<string>()
{
    "Fred","Joe","John"
};

list.RemoveAll((string val) =>
{
    return (0 == val.CompareTo("Fred"));
});

所有这些都是使用Linq扩展。

如果您无法转换为使用列表,则可以使用ToList&lt;&gt;()方法进行转换。但是你必须做一些明确的插入操作。像这样;

LinkedList<string> str = new LinkedList<string>();
str.AddLast("Fred");
str.AddLast("Joe");
str.AddLast("John");

List<string> ls = str.ToList();
ls.RemoveAll((string val) => val.CompareTo("Fred") == 0);
str.Clear();
ls.ForEach((string val) => str.AddLast(val));

如果所有这些仍然不合适,那么尝试像这样做一个LinkedList的副本;

LinkedList<string> str = new LinkedList<string>();
str.AddLast("Fred");
str.AddLast("Joe");
str.AddLast("John");

LinkedList<string> strCopy = new LinkedList<string>(str);
str.Clear();
foreach (var val in strCopy)
{
    if (0 != val.CompareTo("Fred"))
    {
        str.AddLast(val);
    }
}

我希望有所帮助。

答案 5 :(得分:0)

据我了解你想要在循环中迭代,其中包含null -s的循环,所以你可以使用下面的内容:

for (LinkedListNode<string> node = a.First; node != a.Last.Next; node = node.Next)
{
               // do something here 

}