Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/elixir/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linq 我可以使用Action<;T>;执行递归搜索并返回指定属性的IEnumerable?_Linq_Generics_C# 4.0_Action - Fatal编程技术网

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-请看公认的答案。这是很容易理解的,而且效果很好。