我似乎遇到了一个问题,就是在执行一个之前分配给变量的lambda表达式时出现了困难。以下是我编写的一个小型C#示例程序:
public class Program
{
public static void Main(string[] args)
{
int[] notOrdered = { 3, 2, 5, 8, 1, 4, 7, 9, 6 };
Print(notOrdered);
IEnumerable<int> ascOrdered = Order(notOrdered, true);
Print(ascOrdered);
IEnumerable<int> descOrdered = Order(notOrdered, false);
Print(descOrdered);
}
static IEnumerable<T> Order<T>(IEnumerable<T> enumerables, bool ascending)
{
Expression<Func<T, object>> selector = (z) => z; // simple for demo purposes; pretend it's complex
if (ascending)
return enumerables.OrderBy(z => selector);
else
return enumerables.OrderByDescending(z => selector);
}
static void Print<T>(IEnumerable<T> enumerables)
{
foreach(T enumerable in enumerables)
Console.Write(enumerable.ToString() + " ");
Console.WriteLine();
}
}
我希望它输出如下结果:
3 2 5 8 1 4 7 9 6 1 2 3 4 5 6 7 8 9 9 8 7 6 5 4 3 2 1
但是,令人困惑的是,它却输出了这个:
3 2 5 8 1 4 7 9 6 3 2 5 8 1 4 7 9 6 3 2 5 8 1 4 7 9 6
基本上,我只想能够将同一个表达式传递给两个不同的排序操作,而不必输入两次。因此我先将其赋值给"selector"。在我的实际应用中,lambda表达式非常冗长/混乱,我不想重复这个麻烦,我宁愿像这里一样引用一个变量。
那么,a)是什么原因导致当前输出? b)我如何得到我想要的输出?
Expression<Func<T, object>> selector = (z) => z;
而不是只用Func<T, object> selector = (z) => z;
;如果你将其更改为 Func,并使用OrderBy(selector)
,它是否按预期工作? - Lorenzo DemattéPrint(notOrdered.OrderBy(i=>i));
它就能正常工作了。 - Sten Petrovz => selector
这段代码。顺便说一下,这就是你的 bug :) - usr