/// <summary> /// 这个不单单是合并,在合并时还会判断是否可以合并,而是否可以合并的条件又包含需要向上和向下判断是否Compare成功,所以还需要 /// DReport detailRoot, ref CompareDetailParam param, int groupIdx, int rowIdx, ref HashSet<DRow> crossJugeRowList这一坨参数 /// </summary> /// <param name="resultType"></param> /// <param name="drow"></param> /// <param name="detailRoot"></param> /// <param name="param"></param> /// <param name="groupIdx"></param> /// <param name="rowIdx"></param> /// <param name="crossJugeRowList"></param> void MergeRow(ERowCompareResultType resultType, DRow drow, DReport detailRoot, ref CompareDetailParam param, int groupIdx, int rowIdx, ref HashSet <DRow> crossJugeRowList) { switch (resultType) { case ERowCompareResultType.FAILED: case ERowCompareResultType.FAILED_CROSSJUGE: { param.CurrentNotDirtyUpRowNum = 0; string fileName = detailRoot.metaData.fileDetails[0].location + "\\" + detailRoot.metaData.fileDetails[0].name; int line = param.GetRealHandleLineNum(); Dictionary <int, List <int> > lineResult; if (!FaildFileResult.TryGetValue(fileName, out lineResult)) { lineResult = new Dictionary <int, List <int> >(); FaildFileResult.Add(fileName, lineResult); } List <int> lineData; if (!lineResult.TryGetValue(line, out lineData)) { bool isNew = true; if (lineResult.Count > 0) { if ((lineResult.Last().Value.Last() + 1) == line) { lineResult.Last().Value.Add(line); isNew = false; } } if (isNew) { lineData = new List <int> { line }; lineResult.Add(line, lineData); } } break; } case ERowCompareResultType.SUCCEED: { if (param.CheckCanMergeByDirtyRow() == false) { param.CurrentNotDirtyUpRowNum = 0; break; } int iGroupIdx = groupIdx; int iRowIdx = rowIdx; bool isDownDirty = false; for (int i = 0; i < param.NeedNotDirtyDownRowNum; ++i) { var nRow = param.GetNextRow(detailRoot, ref iGroupIdx, ref iRowIdx, 1); if (nRow != null) { var cResult = CompareRow(detailRoot, nRow, iGroupIdx, iRowIdx, ref crossJugeRowList); if (cResult == ERowCompareResultType.FAILED || cResult == ERowCompareResultType.FAILED_CROSSJUGE) { isDownDirty = true; break; } } } if (isDownDirty == true) { param.CurrentNotDirtyUpRowNum = 0; break; } param.CurrentNotDirtyUpRowNum++; if (drow.lines.Length >= 2) { if (drow.lines[0].file == 1 && drow.lines[1].file == 2) { //可以合并,修改 ReplaceLine(ref param.LineList1, param.GetRealHandleLineNum(), param.GetRealLineText(drow.lines[1].file, drow.lines[1].number)); } else if (drow.lines[0].file == 1 && drow.lines[1].file == 3) { //可以合并,删除 RemoveLine(ref param.LineList1, param.GetRealHandleLineNum()); param.OffsetLineNum--; } else if (drow.lines[0].file == 2 && drow.lines[1].file == 3) { //可以合并,新增 InsertLine(ref param.LineList1, param.GetRealHandleLineNum(), param.GetRealLineText(drow.lines[0].file, drow.lines[0].number)); param.OffsetLineNum++; } } else { if (drow.lines[0].file == 1) { //可以合并,删除 RemoveLine(ref param.LineList1, param.GetRealHandleLineNum()); param.OffsetLineNum--; } else if (drow.lines[0].file == 2) { //可以合并,新增 InsertLine(ref param.LineList1, param.GetRealHandleLineNum(), param.GetRealLineText(drow.lines[0].file, drow.lines[0].number)); param.OffsetLineNum++; } else if (drow.lines[0].file == 3) { //不用管 } } break; } case ERowCompareResultType.SUCCEED_CROSSJUGE: { MergeRow(ERowCompareResultType.SUCCEED, drow, detailRoot, ref param, groupIdx, rowIdx, ref crossJugeRowList); break; } default: { param.CurrentNotDirtyUpRowNum = 0; break; } } }
public void CompareDetail(string xmlPath) { if (OnlyFoderCompare) { return; } if (File.Exists(xmlPath) == false) { return; } HashSet <DRow> crossJugeRowList = new HashSet <DRow>(); //以下详细文件的合并,为了以防万一,必须满足以下的所有条件才会合并,否则跳过,人工自己合并 DReport detailRoot = Deserialize <DReport>(xmlPath); if (detailRoot.type != "FileComparison") { return; } string file1 = detailRoot.metaData.fileDetails[0].location + "\\" + detailRoot.metaData.fileDetails[0].name; string file2 = detailRoot.metaData.fileDetails[1].location + "\\" + detailRoot.metaData.fileDetails[1].name; string file3 = detailRoot.metaData.fileDetails[2].location + "\\" + detailRoot.metaData.fileDetails[2].name; CompareDetailParam param = new CompareDetailParam(); param.NeedNotDirtyUpRowNum = UpNeedNotDirtyRow; param.NeedNotDirtyDownRowNum = DownNeedNotDirtyRow; GetFileLine(ref param.LineList1, file1); GetFileLine(ref param.LineList2, file2); GetFileLine(ref param.LineList3, file3); DebugLog("CompareDetail: FileName:" + detailRoot.metaData.fileDetails[0].name); int groupNum = detailRoot.rowData.rowGroups.Length; for (int groupIdx = 0; groupIdx < groupNum; ++groupIdx) { var dgroup = detailRoot.rowData.rowGroups[groupIdx]; if (CompareDetailCallBack != null) { CompareDetailCallBack(groupNum, groupIdx, ""); } for (int rowIdx = 0; rowIdx < dgroup.rows.Length; ++rowIdx) { param.RealRowIdx++; var drow = dgroup.rows[rowIdx]; //如果3路里有其中一路有变化才做对比 bool needHandl = false; foreach (var dline in drow.lines) { if (dline.modifyClass != "U" && dline.modifyClass != "UU") { needHandl = true; break; } } //记录最左边路上一次能获取的行数 if (drow.lines[0].file == 1) { param.HandleLineNum = drow.lines[0].number; } if (needHandl == false) { param.CurrentNotDirtyUpRowNum++; continue; } var result = CompareRow(detailRoot, drow, groupIdx, rowIdx, ref crossJugeRowList); MergeRow(result, drow, detailRoot, ref param, groupIdx, rowIdx, ref crossJugeRowList); } } SaveFileLine(ref param.LineList1, file1); }