有沒有辦法.Net動態呼叫ToDictionary(<lambda key>, <lambda val>)以減少Dictionary運行 LINQ 運算式時回傳的樣板。
C# 示例:
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 更加冗長:
Dim d_filt = d_in.Where(Function(p) p.value > 2).ToDictionary(Function(p) p.Key, Function(p) p.Value)
當然,最巧妙的解決方案是添加一個ToDict() Extension不帶引數的結果:
// Preferred Expression:
d_filt = d_in.Where(p => p.value > 2).ToDict()
uj5u.com熱心網友回復:
不需要反射,只是普通的通用
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 不能使用空鍵。
作為獎勵,它保持流暢的語法,所以你可以使用
d_filt = d_in.Where(p => p.value > 2).ToDict();
uj5u.com熱心網友回復:
為了建立@Martheen 的答案,這里是如何在 VB 中實作 ToDict() 擴展:
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
uj5u.com熱心網友回復:
這是linq2Dict()VB中的一個實作:
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
例如:
d_filt = linq2Dict(d_in.Where(p => p.value > 2))
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/493630.html
