在 LINQ lambda 中解压元组

twi*_*kes 2 c# linq lambda tuples

我有一个使用元组进行优化的 LINQ 查询。但是,我无法找到在参数中解包元组的有效语法,这似乎令人惊讶,因为 C# 确实支持解包元组,而其他支持 lambda 和元组的语言确实支持解包。

有没有办法在下面的表达式中利用解包而不是引用完整元组的属性?

            shelves
                .Select(kv => (kv.Key, kv.Value.Orders.Count))
                .Where(tuple => tuple.Count > 0)
                .OrderBy(tuple => tuple.Count)
                .Select(tuple => tuple.Key);
Run Code Online (Sandbox Code Playgroud)

Pav*_*ski 7

C# 支持元组解构,但在您的情况下不可能使用 lambda 参数。

你宣布一个不愿透露姓名的元组Select,并且可以访问项目使用Item1Item2等特性

shelves
    .Select(kv => (kv.Key, kv.Value.Orders.Count))
    .Where(tuple => tuple.Item2 > 0)
    .OrderBy(tuple => tuple.Item2)
    .Select(tuple => tuple.Item1);
Run Code Online (Sandbox Code Playgroud)

您也可以切换到命名元组语法

shelves
    .Select(kv => (Key: kv.Key, Count: kv.Value.Orders.Count))
    .Where(tuple => tuple.Count > 0)
    .OrderBy(tuple => tuple.Count)
    .Select(tuple => tuple.Key);
Run Code Online (Sandbox Code Playgroud)

或者甚至使用匿名类型,它不会使您与属性名称混淆(因为它使用与用于初始化它们的属性相同的名称)

shelves
    .Select(kv => new { kv.Key, kv.Value.Orders.Count})
    .Where(x => x.Count > 0)
    .OrderBy(x => x.Count)
    .Select(x => x.Key);
Run Code Online (Sandbox Code Playgroud)

  • @twinlakes 它能回答您的问题吗?您需要更多详细信息或信息吗? (2认同)
  • 这是一个答案——一个很好的答案——但这不是我们想要的答案。我们想要的答案是解构 lambda 参数中的元组。不幸的是,这不是我们今天生活的世界。 (2认同)