猿问

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

我有以下类型的名为 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以列出项目,我如何确保它不在项目列表或其内部子列表中,然后将其添加到项目列表或其任何内部子列表中?


动漫人物
浏览 176回答 2
2回答

红糖糍粑

使用扩展功能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) {&nbsp; &nbsp; var working = new Stack<T>();&nbsp; &nbsp; working.Push(current);&nbsp; &nbsp; while (working.Count > 0) {&nbsp; &nbsp; &nbsp; &nbsp; current = working.Pop();&nbsp; &nbsp; &nbsp; &nbsp; yield return current;&nbsp; &nbsp; &nbsp; &nbsp; if (childrenFn(current) != null)&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; foreach (var child in childrenFn(current))&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; working.Push(child);&nbsp; &nbsp; }}您可以展平您的原件ITEMS List,然后检查您的新项目是否在其中:var exists = ITEMS.Flatten(x => x.Child).Select(x => x.itemName).Contains(newItemID);如果您经常这样做,那么考虑基于散列的结构(例如 a)可能是明智的,Dictionary或者如果您有一个唯一的项目列表要添加,则从扁平化的项目中创建一个散列集ITEMS以加快检查速度。

慕盖茨4494581

向类中添加递归方法,如下所示://using System.Linq;public class ABC(&nbsp; &nbsp; string itemName{get;set;}&nbsp; &nbsp; int parentID{get;set;}&nbsp; &nbsp; List<ABC> Child {get;set;}&nbsp; &nbsp;&nbsp;&nbsp; &nbsp; public bool AlreadyContains(ABC abc)&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; if (Child.Any( a => a.itemName == abc.itemName )) return true;&nbsp; //Check children&nbsp; &nbsp; &nbsp; &nbsp; return Child.Any( a => a.AlreadyContains(abc) );&nbsp; &nbsp;//Ask children to check their children too&nbsp; &nbsp; })然后你可以用一行代码检查:if (!abc.AlreadyContains(newAbc)) abc.Add(newAbc);注意:上面的例子假设当它们的 itemNames 相等时 abc 实例是相等的。当然,您可以修改条件,例如abc.Equals(newAbc)您是否已经覆盖了 Equals(),或者abc == newAbc如果您想要引用相等。
随时随地看视频慕课网APP

相关分类

Go
我要回答