你問到列表,字典等含字典詞典。
我最近類似的話題,在這裏我想有一個可查詢字典(即一個擴展方法,它允許通過一個查詢表達式作爲拉姆達參數),你可以用這樣的:
var result = myDictionary.QueryDictionary(w => myList.Any(a => a == w.Key));
的此代碼行的目的是檢查myList中是否包含字典的任何鍵。
因此,我所做的就是這個,我寫了下面的擴展方法:
// extension method using lambda parameters
public static Dictionary<string, T> QueryDictionary<T>(
this Dictionary<string, T> myDict,
Expression<Func<KeyValuePair<string,T>, bool>> fnLambda)
{
return myDict.AsQueryable().Where(fnLambda).ToDictionary(t => t.Key, t => t.Value);
}
它可用於每個具有string
型和每一個對象類型T
項的鍵字典。
現在,你可以通過一個lambda表達式,如下面的例子很容易地編寫查詢:
var list1 = new List<string>() { "a", "b" };
var myDict = new Dictionary<string, object>();
myDict.Add("a", "123"); myDict.Add("b", "456"); myDict.Add("c", "789");
var result = myDict.QueryDictionary(w => list1.Any(a => a == w.Key));
結果將包含的項目A和B,因爲它們都包含在列表1。
您也可以查詢字典詞典的,下面是LinqPad一個C#例子,但它可以作爲一個控制檯應用程序,以及(只是註釋掉.Dump()
聲明和Console.WriteLine(...)
語句代替它):
void Main()
{
// *** Set up some data structures to be used later ***
var list1 = new List<string>() { "a", "b", "d" }; // a list
var myDict = new Dictionary<string, object>(); // the dictionary
myDict.Add("a", "123"); myDict.Add("b", "456"); myDict.Add("c", "789");
var myDict2 = new Dictionary<string, object>(); // 2nd dictionary
myDict2.Add("a", "123"); myDict2.Add("b", "456"); myDict2.Add("c", "789");
myDict.Add("d", myDict2); // add 2nd to first dictionary
// *** 1. simple query on dictionary myDict ***
var q1 = myDict.QueryDictionary(w => list1.Any(a => a == w.Key));
q1.Dump();
// *** 2. query dictionary of dictionary (q3 contains result) ***
var q2 =
(Dictionary<string, object>)q1.QueryDictionary(w => w.Key.Equals("d")).First().Value;
var q3 = q2.QueryDictionary(w => w.Key.Equals("b"));
q3.Dump();
}
// *** Extension method 'QueryDictionary' used in code above ***
public static class Extensions
{
public static Dictionary<string, T> QueryDictionary<T>(
this Dictionary<string, T> myDict,
Expression<Func<KeyValuePair<string, T>, bool>> fnLambda)
{
return myDict.AsQueryable().Where(fnLambda).ToDictionary(t => t.Key, t => t.Value);
}
}
由於此解決方案使用的是泛型,因此您可以傳遞任何lambda表達式作爲搜索參數,因此它非常靈活。
完美。謝謝。 – Brian 2010-09-16 11:48:32