0

Есть 2 текстовых файла и надо вывести индексы всех строк, где есть отличия

Проблема моего кода:

Формат вывода не тот. Хотел сделать, чтобы выводилось не слово которое отличается, а именно номер строки которая отличается.

Например: текст в 1 файле "Hello world", а во 2-м файле "Hello"

И я хочу чтобы вместо world, вывелось "изменения в 1 строчке"

Мой код:

public List<string> Diff()
{
    var lines1 = File.ReadAllLines(_test1).ToArray();
    var lines2 = File.ReadAllLines(_test2).ToArray();
var symDiff = lines1.Except(lines2).Union(lines2.Except(lines1)).ToList();

return symDiff;

}

Colibri
  • 3
  • 2
  • 1
    Отлично!)) Теперь скажите в чем конкретно проблема? Выводится не то, что вы ожидали или выдает ошибку? В любом случае лучше привести минимальный пример, который можно было бы запустить у себя. – Павел Ериков stand with Russia Mar 17 '21 at 16:27
  • формат вывода не тот( хотел сделать что вывело не слово которое отличается ,а именно номер строки которая отличается

    ну например текст в 1 файле "Hello world" а во 2-м файле "Hello" и я хочу вместо того что бы вывело не world а просто "изменения в 1 строчке"

    – Colibri Mar 17 '21 at 16:29
  • Пожалуйста занесите все это в сам вопрос нажав на кнопку "Править" под вопросом – Павел Ериков stand with Russia Mar 17 '21 at 16:36
  • @tym32167 не совсем, автору требуется получить индексы различных строк – Павел Ериков stand with Russia Mar 17 '21 at 16:48
  • тогда это вопрос простого цикла по коллекциям – tym32167 Mar 17 '21 at 16:51

2 Answers2

1

Linq вариант (не проверял, проверяйте сами, но идея ясна)

public List<string> Diff()
{
    var lines1 = File.ReadAllLines(_test1);
    var lines2 = File.ReadAllLines(_test2);
return lines1.Zip(lines2, (x,y)=&gt;(x,y))
    .Select((item, i) =&gt; (item, i))
    .Where(x=&gt; string.CompareOrdinal( x.item.x, x.item.y) != 0)
    .Select(x=&gt;$&quot;изменения в {x.i + 1} строчке&quot;)
    .ToList();  

}

aepot
  • 49,560
tym32167
  • 32,857
  • ReadLines возвращает IEnumerable<string>, кстати, может это повод улучшить ответ с точки зрения прожорливости в отношении оперативы :) А ReadAllLines возвращает string[]. – aepot Mar 17 '21 at 17:24
  • 1
    @aepot почему бы и нет, хотя это решает проблему, которой у автора вопроса нет :) – tym32167 Mar 17 '21 at 17:25
  • ReadAllLines надежнее в плане файл будет вычитан полностью и гарантированно закрыт, в то время как у ReadLines могут быть нюансы, если вычитывать не до конца. Так что это из разряда "а еще вот так вот можно". – aepot Mar 17 '21 at 17:27
0

Как вариант

var lines1 = File.ReadAllLines(_test1);
var lines2 = File.ReadAllLines(_test2);

var len = Math.Max(lines1.Length, lines2.Length);

for (int i = 0; i < len; i++) if (lines1.Length <= i || lines2.Length <= i || string.CompareOrdinal(lines1[i], lines2[i]) != 0) Console.WriteLine($"изменения в {i + 1} строчке");

aepot
  • 49,560
tym32167
  • 32,857