Это хороший способ перебирать .NET LinkedList и удалять элементы? - PullRequest
5 голосов
/ 28 февраля 2010

Я думаю сделать следующее:

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

Что мне интересно, так это: если просто указать it.Value на ноль, то на самом деле от него избавится.

Ответы [ 6 ]

9 голосов
/ 26 мая 2015

Установка значения it.Value не приведет к удалению узла из списка. Вот один из способов:

    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 голос
/ 28 февраля 2010

Вы меняете значение, на которое указывает LinkedListNode; имейте в виду, что в вашем списке теперь будет дыра ( пустой узел).

Вместо A - B - C у вас будет A - null - C, если вы "удалите" B. Это то, чего вы хотите достичь?

1 голос
/ 28 февраля 2010

Конечно (со связанным списком) вам нужно изменить ссылку.

Например, если вы хотите удалить B из LL A-B-C, вам нужно изменить ссылку A на B на C.

Признаюсь, я не знаком с реализацией связанных списков в .NET, но, надеюсь, это начало для вас.

0 голосов
/ 12 июня 2012

Насколько я понял, вы хотите выполнить итерацию в связном списке с циклом for, в котором olso содержит нуль-s, поэтому вы можете использовать следующее:

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

}
0 голосов
/ 28 февраля 2010

Если вы можете перейти к использованию List <>, а не LinkedList <>, тогда вы можете использовать операцию RemoveAll (). Передайте анонимного делегата вот так;

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

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

Все это использует расширения Linq.

Если вы не можете перейти к использованию списка, вы можете использовать метод ToList <> () для его преобразования. Но тогда вам придется выполнить некоторые операции очистки и вставки. Как это;

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

Надеюсь, это поможет.

0 голосов
/ 28 февраля 2010

Полагаю, что-то подобное требуется

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;
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...