Я думаю о выполнении следующего:
for(LinkedListNode<MyClass> it = myCollection.First; it != null; it = it.Next)
{
if(it.Value.removalCondition == true)
it.Value = null;
}
То, что я задаюсь вопросом: при простом указании it.Value
к пустому указателю на самом деле избавляется от него.
Обязательно (со связным списком) ссылку поменять надо.
Например, если вы хотите удалить B из LL ABC, вам нужно изменить ссылку A с B на C.
Признаюсь, я не знаком с реализацией связанных списков в .NET, но надеюсь, что это начало для вас.
Полагаю, требуется что-то вроде этого
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;
}
}
Вы изменяете значение, на которое указывает LinkedListNode
; помните, что теперь ваш список будет содержать дыру ( пустой узел ).
Вместо A - B - C
у вас будет A - null - C
, если вы «удалите» B
. Это то, чего вы хотите достичь?
Если вы можете перейти на использование 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);
}
}
Надеюсь, это поможет.