c# - 使用linq比较两个文本文件?

标签 c# linq

我在一个文件夹中有 4 个文本文件和一个 pattern.txt 来比较这些文本文件..在 pattern.txt 我有

insert
update
delete
drop

我需要将这个文本文件与那四个文本文件进行比较,如果这些模式与该文本文件中的任何行匹配,我必须将这些行写入另一个日志文件中……我已经使用 linq 读取了这些文件……我需要比较这些文件并在带有行号的文本文件中写入..这是我的代码

var foldercontent = Directory.GetFiles(pathA)
                    .Select(filename => File.ReadAllText(filename))
                    .Aggregate(new StringBuilder(),
                    (sb, s) => sb.Append(s).Append(Environment.NewLine),
                    sb => sb.ToString());

 var pattern =  File.ReadAllLines(pathB).Aggregate(new StringBuilder(),
                    (sb, s) => sb.Append(s).Append(Environment.NewLine),
                    sb => sb.ToString());

using (var dest = File.AppendText(Path.Combine(_logFolderPath, "log.txt")))
            {
      //dest.WriteLine("LineNo : " + counter.ToString() + " : " + "" + line);
            }

编辑 我已经使用 c# 来比较两个文本文件,但我需要在 linq 中使用它

while ((line = file.ReadLine()) != null)
{
if (line.IndexOf(line2, StringComparison.CurrentCultureIgnoreCase) != -1)
{
dest.WriteLine("LineNo : " + counter.ToString() + " : " + " " + line.TrimStart());
}
counter++;
}
file.BaseStream.Seek(0, SeekOrigin.Begin);
counter = 1; 

最佳答案

可能有一个更简单的解决方案,但如果您真的想使用 LINQ,这至少是可行的:

var foldercontent = Directory.GetFiles(pathA)
                    .Select(filename => new
                    {
                        Filename = filename,
                        Lines = File.ReadAllLines(filename)
                    })
                    .SelectMany(file => file.Lines.Select((line, idx) => new
                    {
                        LineNumber = idx + 1,
                        Text = line,
                        FileName = file.Filename
                    }));

var pattern = File.ReadAllLines(pathB);

var result = from fileLine in foldercontent
             where pattern.Any(p => fileLine.Text.IndexOf(p, StringComparison.CurrentCultureIgnoreCase) != -1)
             select fileLine;

foreach (var match in result)
{
    System.Diagnostics.Debug.WriteLine("File: {0} LineNo: {1}: Text: {2}", match.FileName, match.LineNumber, match.Text);
}

或者,如果您愿意,可以将其组合成一个 LINQ 查询(但我认为这不是很可读):

var result = from fileLine in (Directory.GetFiles(pathA)
                    .Select(filename => new
                    {
                        Filename = filename,
                        Lines = File.ReadAllLines(filename)
                    })
                    .SelectMany(file => file.Lines.Select((line, idx) => new
                    {
                        LineNumber = idx + 1,
                        Text = line,
                        FileName = file.Filename
                    })))
                where File.ReadAllLines(pathB).Any(p => fileLine.Text.IndexOf(p, StringComparison.CurrentCultureIgnoreCase) != -1)
                select fileLine;

关于c# - 使用linq比较两个文本文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4499431/

相关文章:

c# - 使用 C# Moq 模拟 ElasticSearch 客户端

c# - FolderBrowserDialog - 发生 Win32Exception - 参数不正确

c# - MEF 的 ClickOnce 问题

c# - 不确定 linq to sql 查询的返回类型

.net - 默认 VS 对象可视化工具中的 LINQ to SQL 分组错误

c# - 表达式几乎相同,但其中一个不起作用

c# - Unity Input 在按下时多次检测到

c# - 如何设置依赖属性值?

c# - Linq 从两个表中选择按列表排序

asp.net - 使用 LINQ 连接 2 个列表?