我正在尝试将Linq Query示例转换为Lambda,但我在翻译Let子句时遇到了问题。
var numbers = from n in arrayOfNumbers
orderby n
let evenOrOdd = (n % 2 == 0) ? "Even" : "Odd"
group n by evenOrOdd into nums
orderby nums.Count()
select nums;
此示例按预期工作:
var numbers = arrayOfNumbers.OrderBy(n => n)
.GroupBy(n => (n % 2 == 0) ? "Even" : "Odd")
.OrderBy(k => k.Count());
上述查询和示例都可以通过以下方式打印:
foreach (var item in numbers)
{
Console.WriteLine($"{item.Key}");
foreach (var i in item)
{
Console.WriteLine($" {i}");
}
}
但是我想让它更具可读性并以某种方式提取条件,所以我尝试了这个(从这篇文章LINQ Let operator with lambda syntax得到了想法)但它
var numbers = arrayOfNumbers.OrderBy(n => n)
.Select(evenOrOdd => new
{
Number = evenOrOdd,
Key = (evenOrOdd % 2 == 0) ? "Even" : "Odd"
})
.GroupBy(n => n.Key)
.OrderBy(k => k.Count());
现在打印有点改变,我需要具体说我要打印数字。
foreach (var item in numbers)
{
Console.WriteLine($"{item.Key}");
foreach (var i in item)
{
Console.WriteLine($" {i.Number}");
}
}
将此查询转换为lambda语法的正确方法是什么,条件以某种方式“提取”?
答案 0 :(得分:1)
你可以像这样重写你的GroupBy,这样就可以显示你的' let'中间步骤,具有同意结果:
var numbers = arrayOfNumbers
.OrderBy(n => n)
.GroupBy(n => {
var evenOrOdd = (n % 2 == 0);
return evenOrOdd ? "Even" : "Odd";
})
.OrderBy(k => k.Count());
基本上,只要参数和返回类型正确,就可以使用复杂函数作为lambda表达式。
在这种情况下,您无法使用简化的语法,因此它更加冗长,您必须使用return
语句和括号,就像您通常的方法一样。
类似问题的更详细解释如下: