String Linq将一个字符串列表中缺少的项添加到另一个列表中

String Linq将一个字符串列表中缺少的项添加到另一个列表中,string,list,linq,csv,reporting-services,String,List,Linq,Csv,Reporting Services,我有一种方法,可以在SQLServerReportingServices(SSRS)生成的实际CSV文件中查找已知模式的缺失数据,然后将该缺失数据添加到预期的文件中,以便稍后进行比较。 我知道这并不理想,但具有该模式的数据已从我的源数据库中存档,我使用该源数据库构建预期的CSV文件,以便与我的报告数据库(其数据尚未存档)进行比较。在我的预期文件中,只有具有此模式的数据将丢失/存档 下面的方法正在工作,并创建一个新的合并预期文件,其中实际文件中的所有缺失数据都位于正确位置,并且所有原始数据也存在并

我有一种方法,可以在SQLServerReportingServices(SSRS)生成的实际CSV文件中查找已知模式的缺失数据,然后将该缺失数据添加到预期的文件中,以便稍后进行比较。 我知道这并不理想,但具有该模式的数据已从我的源数据库中存档,我使用该源数据库构建预期的CSV文件,以便与我的报告数据库(其数据尚未存档)进行比较。在我的预期文件中,只有具有此模式的数据将丢失/存档

下面的方法正在工作,并创建一个新的合并预期文件,其中实际文件中的所有缺失数据都位于正确位置,并且所有原始数据也存在并移动到新位置以适应缺失的数据

无论如何,我正在尝试实践Linq技术,我想知道如何替换逻辑中的“for”循环。我确实尝试了使用select进行where跟踪,但似乎不能完全正确地理解逻辑/语法

在此方面的任何帮助都将不胜感激

public static byte[] GetExpectedReportDataWithMissingActualData(
        byte[] expectedReportData)
    {
        if (expectedReportData == null) { return expectedReportData; }

        var _expectedReportDataLines = File.ReadAllLines(@"D:\temp\ExpectedReport.csv");
        var _actualReportDataLines = File.ReadAllLines(@"D:\temp\ActualReport.csv");

        // Identify the lines from the actual that contain "missing_pattern"
        var _actualReportDataMissingRows = _actualReportDataLines.Where(reportLine => reportLine.Contains("missing_pattern"));

        // There is no missing pattern data in the actual, simply return the expected as is
        if (_actualReportDataMissingRows.Count() == 0) { return expectedReportData; }

        var _expectedReportDataWithMergedMissingRows = new List<string>();
        var _missingRowsAdded = 0;
        for (var _counter = 0; _counter < _actualReportDataLines.Length; _counter++)
        {
            // Check does the current row in the actual contain the string "missing_pattern"
            if (_actualReportDataMissingRows.Contains(_actualReportDataLines[_counter]))
            {
                // Ensure that these records are not in the expected already
                if (_expectedReportDataLines[_counter - _missingRowsAdded] != _actualReportDataLines[_counter])
                {
                    _expectedReportDataWithMergedMissingRows.Insert(_counter, _actualReportDataLines[_counter]);
                    _missingRowsAdded++;
                    continue;
                }
            }
            _expectedReportDataWithMergedMissingRows.Add(_expectedReportDataLines[_counter - _missingRowsAdded]);
        }

        return _expectedReportDataWithMergedMissingRows.Select(
            reportLine => reportLine + Environment.NewLine).SelectMany(reportLine => Encoding.UTF8.GetBytes(reportLine)).ToArray();
    }
ActualReport.csv

Line1Item1,Line1Item2,Line1Item3
Line2Item1,Line2Item2,Line2Item3
Line1Item1,Line1Item2,Line1Item3
Line2Item1,missing_pattern,Line2Item3
Line3Item1,Line3Item2,Line3Item3
转换为字节数组之前返回的字符串

Line1Item1,Line1Item2,Line1Item3
Line2Item1,missing_pattern,Line2Item3
Line3Item1,Line3Item2,Line3Item3
第1行取自ExpectedReport.csv
第2行取自ActualReport.csv

第3行取自ExpectedReport.csv

能否提供一些示例输入和输出?当我试图通过您的函数运行测试数据时,它没有达到我从您的描述中所期望的效果。很难提供输入和输出数据,因为数据类型是字节数组。我已经完成了字节数组转换&我正试图解决for循环中的linq语法。如果能让理解更容易,字节数组的内容可以去掉。我已经在我的问题中添加了示例文件的内容,以帮助您理解这个概念。您的代码似乎比您的示例所暗示的“确保这些记录不在预期的范围内”做得更多—这是为了什么?如果您在ActualReport.csv
Line1Item1、Line1Item2、Line1Item3
中选择第一行,在变量
\u expectedreportdatawithmergedminingrows
中构建文件的新合并版本时,我们希望通过执行
\u expectedreportdatawithmergedminingrows.Add(\u expectedReportDataLines[\u counter-\u missingRowsAdded])来使用ExpectedReport.csv中的行而不是通过执行
\u expectedReportDataWithMergedMissingRows.Insert(\u counter,\u actualReportDataLines[\u counter]),从ActualReport.csv获取它我仍然不知道这与代码正在做什么或注释有什么关系-它们怎么可能已经在预期中了?
Line1Item1,Line1Item2,Line1Item3
Line2Item1,Line2Item2,Line2Item3
Line1Item1,Line1Item2,Line1Item3
Line2Item1,missing_pattern,Line2Item3
Line3Item1,Line3Item2,Line3Item3