Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/274.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 fluent API方法(C#)_C#_Linq_Reflection_Ienumerable_Iqueryable - Fatal编程技术网

迭代Linq fluent API方法(C#)

迭代Linq fluent API方法(C#),c#,linq,reflection,ienumerable,iqueryable,C#,Linq,Reflection,Ienumerable,Iqueryable,我正在寻找一种方法来迭代以前构建的Linq方法集合,然后对它们进行操作,比如更改表达式树 以下是一个例子: 我只是想做一个forEach(或类似的东西)来获得一个循环,其中: 我在第一个位置得到linq,其中(e=>e.Summary==“sum”) 我在第二个位置得到linq,其中(l=>l.Description==“asd”) 我在上一次迭代中得到linq。取(2) 这可能吗?很可能是反射,但我能做到或找到它 其他示例 使用上面的示例,我想查看Ienumerable/Iqueryable

我正在寻找一种方法来迭代以前构建的Linq方法集合,然后对它们进行操作,比如更改表达式树

以下是一个例子:

我只是想做一个forEach(或类似的东西)来获得一个循环,其中:

我在第一个位置得到linq
,其中(e=>e.Summary==“sum”)

我在第二个位置得到linq
,其中(l=>l.Description==“asd”)

我在上一次迭代中得到linq
。取(2)

这可能吗?很可能是反射,但我能做到或找到它

其他示例

使用上面的示例,我想查看Ienumerable/Iqueryable并获取第一个位置,从而获得与之相当的结果:

var c = list
        .Where(e => e.Summary == "sum");
让我强调一下,我希望通过运行时实现这一点,并将Ienumerable/Iqueryable作为输入


谢谢,

我认为最简单的方法是创建新函数(如
\u Where()
\u Take()
),这些函数只调用
Where
Take
函数,但也要保留调用它们以及使用哪些参数的事实。以后你可以再读一遍

这样做的缺点是,您需要以某种方式存储哪些调用属于哪个调用。例如,如果有两条语句
list.Where().Where()
list.Where().Take()
,则需要保存属于第一行和第二行的调用

您还可以尝试让这些特殊化的函数返回一个包含结果和调用信息的元组。然后,您应该为每个linq方法创建两个函数:一个只接受一个可枚举项,另一个接受一个可枚举项的元组和以前的调用信息。这样,您可以将新的通话信息添加到旧的通话信息中。如果使用扩展函数,那么当然必须扩展枚举和元组

编辑

让我再举一个我的想法的例子。。。请注意,很难完全序列化
Where
函数中给出的函数。这是可能的,例如检查

C.S:

公共静态类重载
{
public static(IEnumerable,List),其中u1(此IEnumerable inp,Func谓词)
{
返回(inp.Where(谓词),新列表{.Where(…)“});
}
public static(IEnumerable,List),其中uuz(this(IEnumerable,List)inp,Func谓词)
{
第2项增补(“.其中(…)”);
返回(inp.Item1.Where(谓词),inp.Item2);
}
公共静态(IEnumerable,List)获取(此IEnumerable inp,int count)
{
返回(inp.Take(count),新列表{$”.Take({count})”});
}
公共静态(IEnumerable,List)获取(此(IEnumerable,List)inp,int计数)
{
inp.Item2.Add($”.Take({count})”;
返回(输入项1.获取(计数),输入项2);
}
}
运行示例:

publicstaticvoidmain(字符串[]args)
{
var a=新列表{0,1,2,3,4,5,6,7,8,9};
var(结果,调用)=a
.其中ux=>x%2==0)
.其中ux=>x%3==0)
.采取措施(1);
Console.WriteLine(string.Join(“,”,result));
WriteLine(string.Join(“,”,calls));
}
输出:

0
.Where(...), .Where(...), .Take(1)

这可能是你要去的方向吗?另请参见:您想循环执行什么操作?什么叫循环?与linq链接或反射的联系是什么?对不起,但是你的问题已经很清楚了。请提供您实际尝试实现的示例。注意:“表达式树应该是不可变的。这意味着如果您要修改表达式树,您必须通过复制现有的表达式树并替换其中的节点来构建新的表达式树。”-我添加了一个可能更简单的示例,以获得一个好的答案。我认为对我来说,两个世界中最好的一个实际上是对这个扩展方法做一个新的覆盖实现,存储这个行为。你怎么想?我想你应该用元组的方法来清洁,请检查我的答案。。。嗯