Страницы

Поиск по вопросам

пятница, 12 июля 2019 г.

ListView не могу правильно поставить условие

Не могу правильно поставить условие
for (int i = 0; i < file1.Count; i++) { for (int j = 0; j < file2.Count; j++) { // Удаленные строки показываются красным цветом, добавленные - желтым, неизмененные - зеленым. if (file1[i] == file2[j])// НЕ измененая строка - зеленая { ListViewItem li = new ListViewItem(); li.ForeColor = Color.Green; li.Text = file1[i]; listView1.Items.Add(li); break; } if (file1[i] != file2[j]) // Удаленные строки показываются красным цветом, { ListViewItem li = new ListViewItem(); li.ForeColor = Color.Red; li.Text = file1[i]; listView1.Items.Add(li); break; } //else if ...// добавленные - желтым, } }
Удаленные строки показываются красным цветом, добавленные - желтым, неизмененные - зеленым. У меня 2 списка
List file1 = new List(); List file2 = new List();
Я ставлю условие что в file найдена строка как и file2 то зеленым, если нет такой то красным ВОТ только цвет изменяется на первой строчке далее идет все красное, а про измененные даже не знаю
Весь код программы:
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.IO; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms;
namespace AnalyzerTwoTextFiles { public partial class Form1 : Form { public Form1() { InitializeComponent(); } List file1 = new List(); List file2 = new List(); private void btn_generation_Click(object sender, EventArgs e) { GetFile1(); WriteToFile(); GetFile2(); listView1.Clear(); for (int i = 0; i < file1.Count; i++) { for (int j = 0; j < file2.Count; j++) { // Удаленные строки показываются красным цветом, добавленные - желтым, неизмененные - зеленым. if (file1[i] == file2[j])// НЕ измененая строка - зеленая { ListViewItem li = new ListViewItem(); li.ForeColor = Color.Green; li.Text = file1[i]; listView1.Items.Add(li); break; } if (file1[i] != file2[j]) // Удаленные строки показываются красным цветом, { ListViewItem li = new ListViewItem(); li.ForeColor = Color.Red; li.Text = file1[i]; listView1.Items.Add(li); break; } //else if ...// добавленные - желтым, } } }
private List GetFile1() { file1.Clear(); using (StreamReader sr = new StreamReader("File1.txt")) { while (!sr.EndOfStream) { string[] s = sr.ReadLine().Split(new char[] { ' ', '\t' }, StringSplitOptions.RemoveEmptyEntries); string arStr; arStr = ""; for (int i = 0; i GetFile2() { file2.Clear(); using (StreamReader sr = new StreamReader("File2.txt")) { while (!sr.EndOfStream) { string[] s = sr.ReadLine().Split(new char[] { ' ', '\t' }, StringSplitOptions.RemoveEmptyEntries); string arStr; arStr = ""; for (int i = 0; i < s.Length; i++) { arStr += s[i] + " "; } file2.Add(arStr); } return file2; } } } }
Пример как должен выглядеть результат рабочий программы

Ссылка на проект - https://github.com/wargerun/AnalyzerTwoTextFiles/


Ответ

Первый файл (образец)
Первая строка. Вторая строка. Третья строка.
Второй файл
Первая строка. 3-я строка. Еще одна строка.
Получилось так

Код такой
///

/// Строка /// class Line { public enum LineType { Unchanged, //неизмененная Added, //добавленная Deleted, //удаленная }
public string Text { get; set; } public LineType Type { get; set; }
public override string ToString() { return $"{Text} : {Type}"; } }
/// /// Подсобный класс для сверки строк /// class LineComparer : IEqualityComparer { public bool Equals(Line x, Line y) { return x.Text.Equals(y.Text); }
public int GetHashCode(Line obj) { return obj.Text.GetHashCode(); } }
class Program { static void Main(string[] args) { Console.WriteLine("ConsoleAppLinesComparison"); Console.WriteLine();
var originFile = @"D:\fileOrigin.txt"; var otherFile = @"D:\fileOther.txt";
List originLines = GetLines(originFile); List otherLines = GetLines(otherFile);
List resultLines = CheckLines(originLines, otherLines);
PrintLines(resultLines);
Console.ReadKey(); }
/// /// Чтение файла в коллекцию строк /// /// путь к файлу /// private static List GetLines(string file) { List result = new List();
try { foreach (var line in File.ReadAllLines(file)) { result.Add(new Line { Text = line }); } } catch (Exception ex) { Console.WriteLine($"Чтение {file} c ошибкой: {ex.Message}"); }
return result; }
/// /// Сверка двух коллекций строк, /// простановка соответ. типов строкам. /// Возвращает объединенную коллекцию строк /// /// коллекция образец /// коллекция для сверки /// объединенная коллекция строк без повторений private static List CheckLines(List originLines, List otherLines) { //все строки которых нет в другом файле var exceptOriginLines = originLines.Except(otherLines, new LineComparer()); foreach (var line in exceptOriginLines) { line.Type = Line.LineType.Deleted; }
//все строки которых нет в оригинальном файле var exceptOtherLines = otherLines.Except(originLines, new LineComparer()); foreach (var line in exceptOtherLines) { line.Type = Line.LineType.Added; }
//объединенная последовательность (без повторений) var unionLines = originLines.Union(otherLines, new LineComparer());
return unionLines.ToList(); }
private static void PrintLines(List resultLines) { Console.ForegroundColor = ConsoleColor.Green; Console.WriteLine("Неизменные строки"); Console.ForegroundColor = ConsoleColor.Red; Console.WriteLine("Удаленные строки"); Console.ForegroundColor = ConsoleColor.Yellow; Console.WriteLine("Добавленные строки");
Console.ForegroundColor = ConsoleColor.White; Console.WriteLine(new string('=', 20)); Console.WriteLine();
foreach (var line in resultLines) { if (line.Type == Line.LineType.Unchanged) { Console.ForegroundColor = ConsoleColor.Green; Console.WriteLine(line.Text); } else if (line.Type == Line.LineType.Added) { Console.ForegroundColor = ConsoleColor.Yellow; Console.WriteLine(line.Text); } else { Console.ForegroundColor = ConsoleColor.Red; Console.WriteLine(line.Text); }
Console.ForegroundColor = ConsoleColor.White; } } }

Комментариев нет:

Отправить комментарий