C#将字典的LINQ查询重构为单个lambda表达式[关闭]

Posted

技术标签:

【中文标题】C#将字典的LINQ查询重构为单个lambda表达式[关闭]【英文标题】:C# Refactor LINQ query of Dictionary into a single lambda expression [closed] 【发布时间】:2021-09-07 14:43:04 【问题描述】:

我是一个相对较新的 C# 程序员,正在努力提高我的 LINQ 查询技能。我更喜欢对我的查询使用方法链接,但我很挣扎。是否可以将此 LINQ 重构为单个 lambda 表达式?这里的代码是一个简化的例子。我的目标是在一行中返回 Key=1 的值。我希望 LINQ 查询在单个 Lambda 表达式中搜索并返回 Key 1 的字符串值。谢谢!

using System;
using System.Collections.Generic;
using System.Linq;

namespace DictionaryPractice

    class Program
            
        static void Main(string[] args)
        
            Dictionary<int, string> myd = new Dictionary<int, string>();
            myd.Add(1, "one");
            myd.Add(2, "two");
            myd.Add(3, "three");
            myd.Add(4, "four");
            
            foreach (var i in myd)
                Console.WriteLine(i.Value);
            Console.WriteLine("");

            var b = myd.Where(c => c.Key == 1).Select(c => c.Value).ToList();
            Console.WriteLine($"Desired output: b[0]");
        
    

【问题讨论】:

预期的输出是included,但您也可以在此之前写入所有值。有什么问题?在写关于预期输出的问题时,您还必须说明与预期不符的实际输出。 你不应该首先使用 linq 来按键查询字典,它只是不适合这个特定工作的工具。字典已针对按键查询数据进行了优化。 我同意作为字典,在搜索具有特定键的项目时不需要linq,但出于学习目的,您可以这样做:Console.WriteLine($"Desired output: myd.FirstOrDefault(z =&gt; z.Key == 1)?.Value"); 好吧抱歉不清楚。我需要我的 LINQ 查询来返回一个字符串。这个例子是我真正工作的一个非常简化的例子。 LINQ 查询的目的是根据 Key 搜索 Dictionary 并将 Value 作为字符串返回。如果可能,我想将其重构为单个 lambda。 @PresadTelkikar 我看不出它有什么优雅之处,但如果你的意思是它更能表达意图,比是的,但它的性能也更差,linq-when-to-use-singleordefault-vs-firstordefault 【参考方案1】:

是否可以将此 LINQ 重构为单个 lambda 表达式?

忽略使用 Linq 在字典中查询单个键值的低效率,不,没有办法在单个 lambda 中执行非平凡的Where 和非平凡的Select

您最多可以创建一个“过滤选择”扩展方法,在其中传入两个 lambda,但我看不到调用两个 Linq 函数的价值。

如果你想摆脱ToList 和索引器,你可以使用Single 代替ToList 来返回单个值。阅读 SingleSingleOrDefaultFirstFirstOrDefault 上的文档以了解差异并确定哪些适合您的需求。

【讨论】:

谢谢你。 Single 可以替换 ToList。就像我提到的,我只是想练习我的 LINQ 技能,但我现在明白这是低效的。同样,我是 C# 新手,有时会想太多。 不用担心-我担心字典示例隐藏了真正的问题。我仍然建议阅读有关各种方法的文档,以了解差异并知道何时使用每种方法。【参考方案2】:

字典只能有一个唯一的键。因此,如果您查找搜索键,则使用 linq 和 tolist() 没有任何意义。试试这个

 Console.WriteLine($"Desired output: myd[1] ");

输出

Desired output: one

只有当你有这样更复杂的搜索时才有意义

var list =  myd.Where(v => v.Key > 2).Select(v =>v.Value).ToList();

但它只有一行。你需要什么?半行?

或者这个?

Console.WriteLine( myd.Where(v => v.Key ==1).Select(v =>v.Value).FirstOrDefault());

但是和第一个一样,只是效率不高

【讨论】:

我在询问重构 LINQ 查询。我知道我可以直接按索引调用字典。我正在使用 LINQ 搜索键并返回值。我需要那个值是一个字符串。

以上是关于C#将字典的LINQ查询重构为单个lambda表达式[关闭]的主要内容,如果未能解决你的问题,请参考以下文章

如何将带有内连接的 sql 查询转换为 linq lambda 表达式?

如何从 PostgreSQL 查询转换为 LINQ 或 lambda 表达式

什么是Linq表达式?什么是Lambda表达式?

Linq之Lambda表达式

编写高质量代码改善C#程序的157个建议——建议27:在查询中使用Lambda表达式

C#入门详解笔记事件 泛型 委托 Lambda表达式 LINQ