Вы спрашивали про списки, словари и словари, содержащие другие словари.
У меня был похожая тема в последнее время, где я хотел бы иметь запрашиваемый словарь (т.е. метод расширения, который позволяет передать выражение запроса в качестве параметра лямбды), который можно использовать как:
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
.
Теперь вы можете легко писать запросы, передавая лямбда-выражения, как показано в следующем примере:
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));
Результат будет содержать пункты а и б, поскольку они содержатся в list1.
Вы также можете запросить словарь словарей, вот пример C# для LinqPad, но он может быть использован в качестве консольного приложения, а также (только закомментируйте .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);
}
}
Поскольку это решение использует дженерики, то вы можете передать любое выражение лямбда в качестве параметра поиска, так что это очень гибкая.
Отлично. Спасибо. – Brian