我想创建一个类似linq的扩展方法来从像树一样的层次结构中获取所有项目。
这是我的扩展
var allGuidelines = Guidelines.GetAllRecursive(x => (IEnumerable<MachineGuidelineTreeItemViewModel>)x.Children);
我称之为
<cache name="prodStockApiEhCache" maxBytesLocalHeap="200M" overflowToDisk="false" eternal="false" timeToIdleSeconds="240" timeToLiveSeconds="360" memoryStoreEvictionPolicy="LRU" />
如何改进此方法,以便每次使用时都不需要进行投射?
提前致谢
答案 0 :(得分:1)
您可以删除TU
类型参数,并在IEnumerable
上使用OfType
代替:
public static List<T> GetAllRecursive<T>(this IList<T> list, Func<T, IEnumerable> func) {
var allList = new List<T>();
var toAdd = list.ToList();
while(true) {
allList.AddRange(toAdd);
var childs = toAdd.SelectMany(x => func(x).OfType<T>()).ToList();
if(childs.Count == 0) {
return allList;
}
toAdd = childs;
}
}
这种方法更宽松,因为它允许您传递返回混合项目包的函数,方法按类型对其进行过滤。