我正在考虑做以下事情:
for(LinkedListNode<MyClass> it = myCollection.First; it != null; it = it.Next)
{
if(it.Value.removalCondition == true)
it.Value = null;
}
我想知道的是:如果简单地将it.Value
指向null,实际上就会将其删除。
答案 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
}