让方法语法中的查询语法?

时间:2018-03-06 15:18:00

标签: c# linq lambda

我正在尝试将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语法的正确方法是什么,条件以某种方式“提取”?

1 个答案:

答案 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语句和括号,就像您通常的方法一样。

类似问题的更详细解释如下:

linq "let" translation