Вот простой способ сделать это:
public static Dictionary<DicKeyCla, DicValCla>
FindDict(List<Dictionary<DicKeyCla, DicValCla>> haystack,
DicKeyCla needle)
{
foreach (Dictionary<DicKeyCla, DicValCla> dict in haystack)
if (dict.ContainsKey(needle))
return dict;
return null;
}
Учитывая список словарей и ключ, он вернет первый словарь, в котором есть этот ключ, или ноль, если его нет в списке.
Или более обобщенно:
public static IDictionary<TKey, TValue>
FindDict<TKey, TValue>(IEnumerable<IDictionary<TKey, TValue>> haystack,
TKey needle)
{
foreach (IDictionary<TKey, TValue> dict in haystack)
if (dict.ContainsKey(needle))
return dict;
return null;
}
Если вам нужно часто выполнять этот поиск или список очень длинный, вам может понадобиться проиндексировать ваши ключи с помощью Dictionary<DicKeyCla, Dictionary<DicKeyCla, DicValCla>>
, в котором содержится, какой словарь содержит какой ключ. Если несколько словарей могут содержать один и тот же ключ, то вам понадобится Dictionary<DicKeyCla, List<Dictionary<DicKeyCla, DicValCla>>>
для хранения вашего индекса.
Если у вас уже есть список и вы хотите создать индекс, вы можете сделать это:
Dictionary<DicKeyCla, Dictionary<DicKeyCla, DicValCla>> index =
new Dictionary<DicKeyCla, Dictionary<DicKeyCla, DicValCla>>();
foreach (Dictionary<DicKeyCla, DicValCla> dict in list)
foreach (KeyValuePair<DicKeyCla, DicValCla> item in dict)
index[item.Key] = dict;
// or in LINQ
Dictionary<DicKeyCla, Dictionary<DicKeyCla, DicValCla>> index =
(from dict in list
from item in dict
select new { item.Key, dict })
.ToDictionary(e => e.Key, e => e.dict);
А вот как вы будете использовать индекс:
public static Dictionary<DicKeyCla, DicValCla>
FindDict(Dictionary<DicKeyCla, Dictionary<DicKeyCla, DicValCla>> index,
DicKeyCla needle)
{
Dictionary<DicKeyCla, DicValCla> result;
index.TryGetValue(needle, out result);
return result;
}