Действительно ли это - хороший способ выполнить итерации через LinkedList.NET и удалить элементы?

Я думаю о выполнении следующего:

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

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

5
задан gonzobrains 1 August 2013 в 22:31
поделиться

4 ответа

Обязательно (со связным списком) ссылку поменять надо.

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

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

1
ответ дан 13 December 2019 в 19:25
поделиться

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

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;
  }
}
0
ответ дан 13 December 2019 в 19:25
поделиться

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

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

1
ответ дан 13 December 2019 в 19:25
поделиться

Если вы можете перейти на использование 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
ответ дан 13 December 2019 в 19:25
поделиться
Другие вопросы по тегам:

Похожие вопросы: