使用嵌套泛型而不需要很多代码

时间:2017-10-13 07:14:20

标签: c# linq generics

我想创建一个类似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" />

如何改进此方法,以便每次使用时都不需要进行投射?

提前致谢

1 个答案:

答案 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;
    }
}

这种方法更宽松,因为它允许您传递返回混合项目包的函数,方法按类型对其进行过滤。