我正在尝试移动列表中的项目,但是当我在移动链接列表中移动项目之前,我与最后一个选项进行比较时退出。有没有办法在节点放到最后并且无法循环移动项目之前执行此操作?
LinkedList<BD> list = new LinkedList<BD>(b[arg].Values);
LinkedListNode<BD> node, terminator, next = null;
List<LinkedListNode<BD>> move = new List<LinkedListNode<BD>>();
terminator = list.First;
node = next = list.Last;
while (next != null && next != terminator)
{
node = next;
next = next.Previous;
if (IDs.Contains(node.Value.Id))
{
move.Add(node);
list.Remove(node);
}
else
{
foreach (var item in move)
{
list.AddBefore(node, item);
node = node.Previous;
}
move.Clear();
}
}
答案 0 :(得分:1)
这对我有用。我尝试了不同的东西,并考虑帮助,但这里对我来说不仅仅是移动到前面,而且只是在列表中移动:
while (next != null)
{
node = next;
next = next.Previous;
if (IDs.Contains(Id))
{
move.Add(node);
list.Remove(node);
}
else
{
foreach (var item in move)
{
list.AddBefore(node, item);
node = node.Previous;
}
move.Clear();
}
if (next == null)
{
foreach (var item in move)
{
list.AddFirst(item);
}
move.Clear();
}
}
答案 1 :(得分:0)
您的代码正在交错两个列表 - 这对我来说不合适 我认为而不是重复阻止
foreach (var item in move)
{
list.AddBefore(node, item);
node = node.Previous;
}
move.Clear();
你可能想要像这样的东西
var before = node.Previous;
var LinkedListNode<BD> current = null;
foreach (var item in move)
{
list.AddBefore(node, item);
current = node = item;
}
current.Previous = before; // assumes move was not empty
move.Clear();
跟踪您要插入的位置。
答案 2 :(得分:0)
这样的东西? (我试着把它建立在你的代码上):
LinkedList<BD> list = new LinkedList<BD>(b[arg].Values);
LinkedListNode<BD> node = list.Last;
LinkedListNode<BD> terminator = null;
while (node != null && node != terminator) {
if (IDs.Contains(node.Value.DocumentVersionId)) {
LinkedListNode<BD> tempNode = node;
node = node.Previous;
list.Remove(tempNode);
list.AddFirst(tempNode);
if (terminator == null) terminator = tempNode;
} else {
node = node.Previous;
}
}
这段代码应该将“DocumentVersionId-matched”节点移动到链表的前面。
下面是一个简单整数的示例,用于演示其工作原理:
List<int> specials = new List<int> { 1, 4, 5, 7 };
List<int> source = new List<int> { 1, 2, 3, 4, 5, 6, 7, 8 };
LinkedList<int> list = new LinkedList<int>(source);
LinkedListNode<int> node = list.Last;
LinkedListNode<int> terminator = null;
while (node != null && node != terminator) {
if (specials.Contains(node.Value)) {
LinkedListNode<int> tempNode = node;
node = node.Previous;
list.Remove(tempNode);
list.AddFirst(tempNode);
if (terminator == null) terminator = tempNode;
} else {
node = node.Previous;
}
}
结果链表将包含:
1,4,5,7(链表开头的特价),2,3,6,8
无限循环应该是不可能的。
回答编辑:
- node = list.First to node = list.Last
- 添加了一个带整数的例子