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 => 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
来返回单个值。阅读 Single
、SingleOrDefault
、First
和 FirstOrDefault
上的文档以了解差异并确定哪些适合您的需求。
【讨论】:
谢谢你。 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 表达式