You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

列表项递增性与冗余性校验:需保留冗余非递增项的技术咨询

实现列表项的冗余+非递增检查,同时保留所有原始项

嘿,我明白你的需求了:你要检查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}");
    }
}

关键说明

  1. 冗余判断:用IsExactDuplicate方法严格校验三个字段,确保只有完全重复的项才被标记为冗余
  2. 递增校验:把Line转成整数比较,避免字符串排序的坑;先比Column,再比Line数值,只要当前项比前一项小,就标记为非递增
  3. 保留原始项:我们没有过滤或删除任何项,只是给每个项加上状态标记,你可以根据这些标记做后续处理(比如高亮、统计等)

测试输出

用你给的示例列表运行后,输出会是:

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 11:00:02