Начнем с начала. У меня есть строка:Не удается найти определенный элемент в LinkedListNode
LOAD B
STORE $2
LOAD A
MPY =5.01E+10
ADD $2
Что выглядит в коде так:
string code = "LOAD B\r\nSTORE $2\r\nLOAD A\r\nMPY =5.01E+10\r\nADD $2\r\n";
И превратить его в LinkedListNode таким образом:
IEnumerable<KeyValuePair<string, string>> pairs =
code.Split(new string[] { Environment.NewLine },
StringSplitOptions.RemoveEmptyEntries)
.Select(x => x.Split(new[] { ' ' },
StringSplitOptions.RemoveEmptyEntries))
.Select(x => new KeyValuePair<string, string>(x[0], x[1]));
var data = new LinkedList<KeyValuePair<string, string>>(pairs);
элемент этого списка KeyValuePair, содержащих левый и правый частей каждой строки строки. Сейчас основная часть. Я должен найти в этой последовательности списка "LOAD a => STORE b"
, где a
и b
может быть любой строкой. После этого я должен найти в следующей части моего списка все элементы с key == b
(в моем примере b = "$2"
) и заменить b
на a
так здесь будет:
LOAD B
STORE B //changed
LOAD A
MPY =5.01E+10
ADD B //changed
Итак, вот мой код так:
string a;
string b;
for(LinkedListNode<KeyValuePair<string, string>> it = data.First; it != null; it = it.Next) {
if(it.Next != null) {
if ((it.Value.Key == "LOAD") &&
(it.Next.Value.Key == "STORE")) {
a = it.Value.Value;
b = it.Next.Value.Value;
for(LinkedListNode<KeyValuePair<string, string>>
current = it; current != null;
current = current.Next) {
//remove found element and replace it
if (current.Value.Value == b) {
data.AddAfter(current, new KeyValuePair<string, string> (current.Value.Key, a));
data.Remove(current);
}
}
}
}
}
После того, как я запустить его я получаю это:
LOAD B
STORE B //changed
LOAD A
MPY =5.01E+10
ADD $2 //still the same
I судимого отлаживать его и выяснил, что if (current.Value.Value == b)
фактически не соответствуют ADD $2
по некоторым причинам. Что может быть неправильным?
Это, как вы можете увидеть, что находится в списке:
foreach (KeyValuePair<string, string> pair in data) {
Console.WriteLine("Key: {0} - Value: {1}", pair.Key, pair.Value);
}
Но на самом деле я сделать эту процедуру в цикле. И ввод строки может иметь более одного «LOAD a => STORE b» – D4C
Кроме того, ранее в том же коде я удалил множество элементов списка по циклу, и все работает нормально. И я успешно записываю правый отрезанный список в файле. Поэтому Remove необходимо сохранить соединения. – D4C
В любом случае интересная идея. – D4C