Я пытаюсь переместить элементы в моем списке, но когда я сравниваю последний вариант, я выхожу, прежде чем переместить элементы в свой список, связанный с перемещением. Есть ли способ сделать это до того, как node будет вставлен в конец и не сможет выполнить цикл для перемещения элементов?
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();
}
}
Вот что сработало для меня. Я пробовал разные вещи и думаю о помощи, но вот что для меня работало больше, чем просто перемещение на передний план, а также просто перемещение по списку:
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();
}
}
Что-то вроде этого? (Я пытался использовать его на вашем коде):
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, в начало связанного списка.
Ниже приведен пример с простыми целыми числами, чтобы продемонстрировать, как это работает:
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.Первый node= list.Last
- добавлен пример с целыми числами
Ваш код чередует два списка - это не выглядит правильным для меня.
Я думаю, что вместо повторного блока
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();
чтобы отслеживать, где вы вставляете.