列表项递增性与冗余性校验:需保留冗余非递增项的技术咨询
实现列表项的冗余+非递增检查,同时保留所有原始项
嘿,我明白你的需求了:你要检查MSheetValue列表是否按规则递增,还要完整保留所有冗余项(Column/Line/Pdf全重复)和非递增项,但目前代码只能处理冗余的情况。我来给你写个完整的实现方案:
首先明确递增规则:默认先按Column升序,当Column相同时,按Line的数值升序(毕竟Line是字符串,直接比字符串会出现"10"<"2"的问题,得转成数字比较)。
先贴出你给出的测试列表代码:
var _lst = new List<MSheetValue>(); _lst.Add(new MSheetValue { Column = 1, Line = "1", Pdf = "PDF1" }); _lst.Add(new MSheetValue { Column = 1, Line = "1", Pdf = "PDF1" }); // 冗余项 _lst.Add(new MSheetValue { Column = 1, Line = "1", Pdf = "PDF2" }); _lst.Add(new MSheetValue { Column = 1, Line = "2", Pdf = "PDF2" }); _lst.Add(new MSheetValue { Column = 1, Line = "3", Pdf = "PDF2" }); _lst.Add(new MSheetValue { Column = 1, Line = "2", Pdf = "PDF2" }); // 非递增项(Line从3回退到2)
完整实现代码
首先补全MSheetValue的辅助方法,然后编写检查逻辑:
public class MSheetValue { public int Column { get; set; } public string Line { get; set; } public string Pdf { get; set; } // 判断是否为完全冗余的项 public bool IsExactDuplicate(MSheetValue other) { return other != null && Column == other.Column && Line == other.Line && Pdf == other.Pdf; } } public void CheckAndMarkListItems(List<MSheetValue> itemList) { if (itemList == null || itemList.Count <= 1) return; // 不修改原列表,仅为每个项标记状态:是否冗余、是否非递增 var itemStatusList = new List<(MSheetValue Item, bool IsRedundant, bool IsNonIncremental)>(); // 第一项无前序项,默认无状态 itemStatusList.Add((itemList[0], false, false)); for (int i = 1; i < itemList.Count; i++) { var currentItem = itemList[i]; var prevItem = itemList[i - 1]; // 标记冗余项:与前一项完全一致 bool isRedundant = currentItem.IsExactDuplicate(prevItem); // 标记非递增项:违反Column+Line的递增规则 bool isNonIncremental = false; if (int.TryParse(currentItem.Line, out int currentLineNum) && int.TryParse(prevItem.Line, out int prevLineNum)) { if (currentItem.Column < prevItem.Column || (currentItem.Column == prevItem.Column && currentLineNum < prevLineNum)) { isNonIncremental = true; } } // 若Line无法转成数字(比如含字母),可在此处添加自定义处理逻辑 itemStatusList.Add((currentItem, isRedundant, isNonIncremental)); } // 示例:输出所有项及其状态 foreach (var status in itemStatusList) { string statusTags = ""; if (status.IsRedundant) statusTags += "[冗余]"; if (status.IsNonIncremental) statusTags += "[非递增]"; Console.WriteLine($"Column: {status.Item.Column}, Line: {status.Item.Line}, Pdf: {status.Item.Pdf} {statusTags}"); } }
关键说明
- 冗余判断:用
IsExactDuplicate方法严格校验三个字段,确保只有完全重复的项才被标记为冗余 - 递增校验:把
Line转成整数比较,避免字符串排序的坑;先比Column,再比Line数值,只要当前项比前一项小,就标记为非递增 - 保留原始项:我们没有过滤或删除任何项,只是给每个项加上状态标记,你可以根据这些标记做后续处理(比如高亮、统计等)
测试输出
用你给的示例列表运行后,输出会是:
Column: 1, Line: 1, Pdf: PDF1 Column: 1, Line: 1, Pdf: PDF1 [冗余] Column: 1, Line: 1, Pdf: PDF2 Column: 1, Line: 2, Pdf: PDF2 Column: 1, Line: 3, Pdf: PDF2 Column: 1, Line: 2, Pdf: PDF2 [非递增]
这样就完美满足你的需求啦,既识别出了所有冗余和非递增项,又完整保留了原始列表的每一项。
内容的提问来源于stack exchange,提问作者mecocopy
相关产品推荐
相关产品推荐

