首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >LINQ -动态调用ToDictionary

LINQ -动态调用ToDictionary
EN

Stack Overflow用户
提问于 2022-06-20 17:56:30
回答 3查看 47关注 0票数 1

.Net中是否有一种方法可以在运行LINQ表达式时动态调用ToDictionary(<lambda key>, <lambda val>)以减少返回Dictionary的样板。

C#示例:

代码语言:javascript
复制
Dictionary<string, object> d_filt;

Dictionary<string, object> d_in = new Dictionary<string, object>();
d_in.Add("k1", 4);
d_in.Add("k2", 3);
d_in.Add("k3", 2);
d_in.Add("k4", 1);

// Current Expression:
d_filt = d_in.Where(p => p.value > 2)
             .ToDictionary(p => p.Key, p => p.Value);

// Preferred Expression:
d_filt = linq2Dict(d_in.Where(p => p.value > 2));

其中,linq2Dict(<LinqObj>)是一个将动态调用ToDictionary(..)方法的助手。

我尝试过反射库,但是我熟悉的标准反射库似乎无法使用ToDictionary

注意: VB更冗长:

代码语言:javascript
复制
Dim d_filt = d_in.Where(Function(p) p.value > 2).ToDictionary(Function(p) p.Key, Function(p) p.Value)

当然,最巧妙的解决方案是添加一个不带任何参数的ToDict() Extension

代码语言:javascript
复制
// Preferred Expression:
d_filt = d_in.Where(p => p.value > 2).ToDict()
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2022-06-20 18:14:59

不需要反射,只是普通的

代码语言:javascript
复制
public static class Convert
{
    public static Dictionary<T,U> ToDict<T,U>(this IEnumerable<KeyValuePair<T,U>> source) where T : notnull
    {
        return source.ToDictionary(s=>s.Key,s=>s.Value);
    }
}

T的约束是因为Dictionary不能使用空键。

更重要的是,它维护了流畅的语法,因此您可以只使用

代码语言:javascript
复制
d_filt = d_in.Where(p => p.value > 2).ToDict();
票数 2
EN

Stack Overflow用户

发布于 2022-06-20 18:47:51

为了在@Martheen's answer上构建,下面是如何在VB中实现ToDict()扩展:

代码语言:javascript
复制
Imports System.Runtime.CompilerServices

Module Convert
    <Extension()>
    Function ToDict(Of T, U)(ByVal source As IEnumerable(Of KeyValuePair(Of T, U))) As Dictionary(Of T, U)
        Return source.ToDictionary(Function(s) s.Key, Function(s) s.Value)
    End Function
End Module
票数 1
EN

Stack Overflow用户

发布于 2022-06-20 18:58:26

以下是VB中linq2Dict()的一个实现:

代码语言:javascript
复制
Public Shared Function linq2Dict(Of T, U)(ByVal source As IEnumerable(Of KeyValuePair(Of T, U))) As Dictionary(Of T, U)
    Return source.ToDictionary(Function(s) s.Key, Function(s) s.Value)
End Function

例:

代码语言:javascript
复制
d_filt = linq2Dict(d_in.Where(p => p.value > 2))
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72691163

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档