为了账号安全,请及时绑定邮箱和手机立即绑定

如何避免在多层列表中添加重复项

如何避免在多层列表中添加重复项

Go
动漫人物 2021-07-15 13:01:15
我有以下类型的名为 ITEMS 的列表public class ABC(    string itemName{get;set;}    int parentID{get;set;}    List<ABC> Child {get;set;}    )因此,如图Class ABC所示 List ITEMS 可以有, List<ABC> Child而 ThatList<ABC> Child可以有另一个List<ABC> Child。这是问题; 如果我想添加新的项目类型Class ABC以列出项目,我如何确保它不在项目列表或其内部子列表中,然后将其添加到项目列表或其任何内部子列表中?
查看完整描述

2 回答

?
红糖糍粑

TA贡献1815条经验 获得超6个赞

使用扩展功能Flatten:


public static IEnumerable<T> Flatten<T>(this IEnumerable<T> e, Func<T, IEnumerable<T>> flattenFn) => e.SelectMany(c => c.Flatten(flattenFn));

public static IEnumerable<T> Flatten<T>(this T current, Func<T, IEnumerable<T>> childrenFn) {

    var working = new Stack<T>();

    working.Push(current);


    while (working.Count > 0) {

        current = working.Pop();

        yield return current;


        if (childrenFn(current) != null)

            foreach (var child in childrenFn(current))

                working.Push(child);

    }

}

您可以展平您的原件ITEMS List,然后检查您的新项目是否在其中:


var exists = ITEMS.Flatten(x => x.Child).Select(x => x.itemName).Contains(newItemID);

如果您经常这样做,那么考虑基于散列的结构(例如 a)可能是明智的,Dictionary或者如果您有一个唯一的项目列表要添加,则从扁平化的项目中创建一个散列集ITEMS以加快检查速度。


查看完整回答
反对 回复 2021-07-18
?
慕盖茨4494581

TA贡献1850条经验 获得超11个赞

向类中添加递归方法,如下所示:


//using System.Linq;


public class ABC

(

    string itemName{get;set;}

    int parentID{get;set;}

    List<ABC> Child {get;set;}    


    public bool AlreadyContains(ABC abc)

    {

        if (Child.Any( a => a.itemName == abc.itemName )) return true;  //Check children

        return Child.Any( a => a.AlreadyContains(abc) );   //Ask children to check their children too

    }

)

然后你可以用一行代码检查:


if (!abc.AlreadyContains(newAbc)) abc.Add(newAbc);

注意:上面的例子假设当它们的 itemNames 相等时 abc 实例是相等的。当然,您可以修改条件,例如abc.Equals(newAbc)您是否已经覆盖了 Equals(),或者abc == newAbc如果您想要引用相等。


查看完整回答
反对 回复 2021-07-18
  • 2 回答
  • 0 关注
  • 175 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信