Заменить строку в списке, которая совпадает с начальной строкой - PullRequest
0 голосов
/ 12 февраля 2019

Я не знаю, правильный ли мой заголовок.

У меня есть список

\1925\10\04\issue1
\1925\10\05\issue1
\1925\10\07\issue1
\1925\10\10\issue1
\1925\10\11\issue1
\1925\10\12\issue1
\1925\10\13\issue1
\1925\10\14\issue1
\1925\10\15\issue1
\1925\10\17\issue1
\1925\10\18\issue1
\1925\10\19\issue1

И то, что я хочу сделать в списке, стало

\1925\10\04\issue1
\05\issue1
\07\issue1
\10\issue1
\11\issue1
\12\issue1
\13\issue1
\14\issue1
\15\issue1
\17\issue1
\18\issue1
\19\issue1

Мне нужно, чтобы он был динамическим.

Может быть, у меня есть такой список

\1925\10\04\issue1
\1925\10\04\issue2
\1925\10\04\issue3
\1925\10\04\issue4

И вывод такой:

\1925\10\04\issue1
\issue2
\issue3
\issue4

Пока что я использую патч сравнения различий.

https://github.com/google/diff-match-patch/wiki/Language:-C%23

А вот мой код.

diff_match_patch dmp = new diff_match_patch();
            var d = dmp.diff_main(@"\1925\10\14\issue1", @"\1925\10\05\issue1");

            //dmp.diff_cleanupEfficiency(d);

            foreach (var item in d)
            {
                Console.WriteLine($"text {item.text} operation {item.operation}");
            }

Но есть ли лучший способ сделать это?или быстрее

1 Ответ

0 голосов
/ 12 февраля 2019

при условии, что у вас есть входные данные как List<string> input, тогда этот код должен работать:

  var splittet = input.Select(i => i.Split("\\".ToCharArray(),  StringSplitOptions.RemoveEmptyEntries));

  Action<string[], int> print = (string[] lst, int index) => Console.WriteLine("\\" + string.Join("\\", lst.Skip(index)));

  splittet.Aggregate(new string[] { },
    (common, item) =>
    {
      var index = Enumerable.Range(0, Math.Min(common.Length, item.Length)).FirstOrDefault(i => common[i] != item[i]);
      print(item, index);
      return item;
    }
    );

Итак, учитывая входные данные

var input = new List<string> { @"\1925\10\04\issue1",
@"\1925\10\05\issue1",
@"\1925\10\07\issue1",
@"\1925\10\10\issue1",
@"\1925\10\11\issue1",
@"\1925\10\12\issue1",
@"\1925\10\04\issue1",
@"\1925\10\04\issue2",
@"\1925\10\04\issue3",
@"\1925\10\04\issue4"};

, это вывод:

\1925\10\04\issue1
\05\issue1
\07\issue1
\10\issue1
\11\issue1
\12\issue1
\04\issue1
\issue2
\issue3
\issue4

Некоторое объяснение:

Сначала вместо того, чтобы работать со списком строк, я разделил его на список токенов.

Тогда я определил какое-то действие печати.вместо этого вы можете добавить результат в список вывода или сделать что угодно.В этом случае это просто запись в консоль

, после чего список агрегируется.Агрегатор начинается с пустого массива строк.затем он пытается найти первый индекс, где первый элемент отличается от списка emtpy, и печатает все части этого индекса.и затем первый индекс возвращается в агрегатор.Затем агрегатор сравнивает этот первый элемент со вторым элементом, находит первый индекс, где детали отличаются, и печатает части оттуда и т. Д. И т. Д.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...