String Linq将一个字符串列表中缺少的项添加到另一个列表中
我有一种方法,可以在SQLServerReportingServices(SSRS)生成的实际CSV文件中查找已知模式的缺失数据,然后将该缺失数据添加到预期的文件中,以便稍后进行比较。 我知道这并不理想,但具有该模式的数据已从我的源数据库中存档,我使用该源数据库构建预期的CSV文件,以便与我的报告数据库(其数据尚未存档)进行比较。在我的预期文件中,只有具有此模式的数据将丢失/存档 下面的方法正在工作,并创建一个新的合并预期文件,其中实际文件中的所有缺失数据都位于正确位置,并且所有原始数据也存在并移动到新位置以适应缺失的数据 无论如何,我正在尝试实践Linq技术,我想知道如何替换逻辑中的“for”循环。我确实尝试了使用select进行where跟踪,但似乎不能完全正确地理解逻辑/语法 在此方面的任何帮助都将不胜感激String Linq将一个字符串列表中缺少的项添加到另一个列表中,string,list,linq,csv,reporting-services,String,List,Linq,Csv,Reporting Services,我有一种方法,可以在SQLServerReportingServices(SSRS)生成的实际CSV文件中查找已知模式的缺失数据,然后将该缺失数据添加到预期的文件中,以便稍后进行比较。 我知道这并不理想,但具有该模式的数据已从我的源数据库中存档,我使用该源数据库构建预期的CSV文件,以便与我的报告数据库(其数据尚未存档)进行比较。在我的预期文件中,只有具有此模式的数据将丢失/存档 下面的方法正在工作,并创建一个新的合并预期文件,其中实际文件中的所有缺失数据都位于正确位置,并且所有原始数据也存在并
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