Linq 我可以使用Action<;T>;执行递归搜索并返回指定属性的IEnumerable?
我编写了以下代码,用于从Linq 我可以使用Action<;T>;执行递归搜索并返回指定属性的IEnumerable?,linq,generics,c#-4.0,action,Linq,Generics,C# 4.0,Action,我编写了以下代码,用于从IEnumerable检索StructureIds: 动作递归=null; List StructureId=新列表(); 递归=(r)=> { 添加(r.StructureId); r、 子类。ForEach(递归); }; IEnumerable structures=GetStructures(); ForEach(递归); 我真的很想让这个通用,这样我就可以将它用于任何IEnumerable,例如: public static IEnumerable<TT
IEnumerable
检索StructureId
s:
动作递归=null;
List StructureId=新列表();
递归=(r)=>
{
添加(r.StructureId);
r、 子类。ForEach(递归);
};
IEnumerable structures=GetStructures();
ForEach(递归);
我真的很想让这个通用,这样我就可以将它用于任何IEnumerable,例如:
public static IEnumerable<TType> GetPropertyValues<TType, TPropertyType>(
this IEnumerable<TType> this, <Property Declaration>)
{
// Generic version of the above code?
}
公共静态IEnumerable GetPropertyValue(
这个可数这个,)
{
//上述代码的通用版本?
}
可以这样做吗?您的问题是,您没有将每个项目添加到列表中,而是添加了每个项目的a属性。该属性将仅适用于
结构
,而不适用于可能与代码一起重用的任何其他类型
你也没有一个机制让你的其他班级的孩子。(您使用的r.Children
属性)
您的两种解决方案是使用接口(即定义iHashChildren
和IGetProperty
),这些接口可以用作简单算法的基本类型,或者您可以将函数传递给您的方法,以便更自由地进行计算。例如,您的方法签名可能需要如下:
public static IEnumerable<TPropertyType> GetPropertyValues<TType, TPropertyType>
(this IEnumerable<TType> rootItem, Func<TType, IEnumerable<TType>> getChildren, Func<TType, TPropertyType> getIdValue)
公共静态IEnumerable GetPropertyValue
(此IEnumerable根项、Func getChildren、Func getIdValue)
。。。但这不会很漂亮 您的问题是,您没有将每个项目添加到列表中,而是添加了每个项目的a属性。该属性将仅适用于
结构
,而不适用于可能与代码一起重用的任何其他类型
你也没有一个机制让你的其他班级的孩子。(您使用的r.Children
属性)
您的两种解决方案是使用接口(即定义iHashChildren
和IGetProperty
),这些接口可以用作简单算法的基本类型,或者您可以将函数传递给您的方法,以便更自由地进行计算。例如,您的方法签名可能需要如下:
public static IEnumerable<TPropertyType> GetPropertyValues<TType, TPropertyType>
(this IEnumerable<TType> rootItem, Func<TType, IEnumerable<TType>> getChildren, Func<TType, TPropertyType> getIdValue)
公共静态IEnumerable GetPropertyValue
(此IEnumerable根项、Func getChildren、Func getIdValue)
。。。但这不会很漂亮
动作
不是很简单。改为Func
怎么样?(未测试代码)
公共静态IEnumerable递归选择(
这是一个数不清的来源,
Func属性选择器,
Func儿童选择器
)
{
foreach(源中的TSource x)
{
收益率-收益率属性选择器(x);
IEnumerable children=childrenSelector(x);
IEnumerable values=children.RecurseSelect(propertySelector,childrenSelector);
foreach(值中的tpropy)
{
收益率y;
}
}
}
然后
IEnumerable<Structure> structures = GetStructures();
IEnumerable<int> structureIds = structures.RecurseSelect(
s => s.StructureId,
s => s.Children);
IEnumerable structures=GetStructures();
IEnumerable StructureId=structures.RecurseSelect(
s=>s.StructureId,
s=>s.儿童);
动作
不是很简单。改为Func
怎么样?(未测试代码)
公共静态IEnumerable递归选择(
这是一个数不清的来源,
Func属性选择器,
Func儿童选择器
)
{
foreach(源中的TSource x)
{
收益率-收益率属性选择器(x);
IEnumerable children=childrenSelector(x);
IEnumerable values=children.RecurseSelect(propertySelector,childrenSelector);
foreach(值中的tpropy)
{
收益率y;
}
}
}
然后
IEnumerable<Structure> structures = GetStructures();
IEnumerable<int> structureIds = structures.RecurseSelect(
s => s.StructureId,
s => s.Children);
IEnumerable structures=GetStructures();
IEnumerable StructureId=structures.RecurseSelect(
s=>s.StructureId,
s=>s.儿童);
绝对完美(原样)。我知道这是可以做到的,谢谢:)。绝对完美。我知道这是可以做到的,谢谢:)。能做到吗?对还有人能理解你的代码吗?不。@Steven-请看公认的答案。这很容易理解,而且效果很好。能做到吗?对还有人能理解你的代码吗?不。@Steven-请看公认的答案。这是很容易理解的,而且效果很好。