stevenlam505 Ответов: 3

Почему мои символы не заменяются?


У меня есть код, который принимает DataTable, преобразует каждый DataRow в строку, а затем удаляет определенные символы ( " | " , " ~ " и т. д.). Однако мой код не удаляет их правильно. Однако, как ни странно, когда я удаляю подчеркивание "_" из своего массива charToRemove, он действительно удаляет трубы правильно.

Изображение с трубами (не имеет подчеркивания в массиве charToRemove)[^]

Изображение с трубами не удалено (имеет подчеркивание в массиве charToRemove)[^]

Что я уже пробовал:

public static List<string> CleanMainLogTable(string liteConString)
{
    string[] charToRemove = new string[] { "*", "~", "|" , "_" };
    string cleanedEntry = "";
    SQLiteConnection liteCon = new SQLiteConnection(liteConString);
    liteCon.Open();
    DataTable dtbl = new DataTable();

    string select = "SELECT LogMessage FROM MainLog_Table";

    SQLiteCommand cmd = new SQLiteCommand(select, liteCon);
    SQLiteDataAdapter sqliteDAP = new SQLiteDataAdapter(cmd);
    sqliteDAP.Fill(dtbl);

    List<string> table = dtbl.AsEnumerable().Select(r => r.Field<string>(0)).ToList();
    int i = 0;

    foreach (string entry in table)
    {
        foreach(string c in charToRemove)
        {
            cleanedEntry = entry.Replace(c, string.Empty);
        }
        Console.WriteLine(i + " " + cleanedEntry);
        i++;
    }
    return null;
}

3 Ответов

Рейтинг:
4

OriginalGriff

Просто: ваш внутренний цикл обрабатывает одну и ту же входную строку каждый раз.
Измените его на этот:

foreach (string entry in table)
    {
    cleanedEntry = entry;
    foreach (string c in charToRemove)
        {
        cleanedEntry = cleanedEntry.Replace(c, string.Empty);
        }
    Console.WriteLine(i + " " + cleanedEntry);
    i++;
    }
И это сработает.


Рейтинг:
28

F-ES Sitecore

Пройдитесь по своему коду в отладчике, и вы увидите, что происходит. В вашем внешнем foreach "запись" будет чем-то в вашем datatable, скажем, "тестом∗". Ваш внутренний цикл foreach заявляет "cleanedEntry" быть "запись" с "*" удален, так cleanedEntry будет "test", но запись по-прежнему "∗испытание". Следующий цикл удалит любое "~" в "entry", но запись все еще остается "*test", поэтому cleanedEntry теперь является "∗test" и так далее. То, что вы хотите сделать, - это все удаления в одной и той же строковой переменной

foreach (string entry in table)
{
    // define cleanedEntry to be the original text
    cleanedEntry = entry;

    foreach (string c in charToRemove)
    {
        // remove the char from cleanedEntry
        cleanedEntry = cleanedEntry.Replace(c, string.Empty);
    }
    Console.WriteLine(i + " " + cleanedEntry);
    i++;
}


Это, вероятно, дает вам еще одну проблему, хотя ваш исходный список "таблица" останется неизменным, так как при перечислении значений вы получаете копию значения, а не ссылку на значение, поэтому ваше удаление выполняется на копии строки в списке, а не на самом списке, так что он остается неизменным. Чтобы обновить список;

List<string> table = dtbl.AsEnumerable().Select(r => r.Field<string>(0)).ToList();

for(int i = 0; i < table.Count; i++)
{
    foreach (string c in charToRemove)
    {
        table[i] = table[i].Replace(c, string.Empty);
    }
    Console.WriteLine(i + " " + table[i]);
}


Рейтинг:
13

Richard MacCutchan

foreach (string entry in table)
{
    foreach(string c in charToRemove)
    {
        cleanedEntry = entry.Replace(c, string.Empty);
    }
    Console.WriteLine(i + " " + cleanedEntry);
    i++;
}

Каждый раз, когда вы называете заменить, Вы можете использовать исходную строку и строку cleanedEntry в качестве назначения. Таким образом, конечным результатом будет исходная строка с удаленными подчеркиваниями.

Попробуй:
foreach (string entry in table)
{
    cleanedEntry = entry;
    foreach(string c in charToRemove)
    {
        cleanedEntry = cleanedEntry.Replace(c, string.Empty);
    }
    Console.WriteLine(i + " " + cleanedEntry);
    i++;
}