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以加快检查速度。
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如果您想要引用相等。
- 2 回答
- 0 关注
- 175 浏览
添加回答
举报