我创建了一个像这样的列表
List<Dictionary<DicKeyCla, DicValCla>>
public Class DicKeyCla
{
public EnKey1 DicKeyItem1,
public EnKey2 DicKeyItem2,
}
public enum EnKey1
{
A1,
A2,
A3,
A4,
A5
}
public enum EnKey2
{
B11,
B12,
B13,
B14,
B15,
B16,
B17,
B18,
B19,
}
据我所知,List类有contains()
方法。
如果我调用的函数包含DicKeyCla
A3
成员,例如B15
和{{1}}。
如何快速从顶级列表中挑选完整的词典成员?
我需要对字典成员进行更多操作。
答案 0 :(得分:1)
List.Contains
方法只检查您发送的参数是否是列表中的项目。
如果您希望能够从此数据结构中找到包含某些给定A3
或B15
的完整字典,则必须自行实现。
您可以执行类似管理内部字典的操作,该字典可以保持从各种A3
/ B15
/ etc对象映射到已添加它们的字典列表。
如果O(1)搜索对您不是很重要,请考虑简化优于性能,并且只扫描列表。
答案 1 :(得分:1)
这是简单的方法:
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;
}
给定一个字典列表和一个键,它将返回具有该键的第一个字典,如果列表中没有,则返回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;
}
以下是您使用索引的方式:
{{1}}
答案 2 :(得分:1)
我有一种奇怪的感觉(但我可能错了)你用List包装你的字典希望你可以用Contains方法搜索字典的1个实例,你想要的只是通过a访问字典成员EnKey1和EnKey2的组合。像这样:
public struct Key // note the struct...
{
public static Key A(EnKey1 k1, EnKey2 k2)
{
Key k = new Key();
k.Key1 = k1;
k.Key2 = k2;
return k;
}
public EnKey1 Key1;
public EnKey2 Key2;
}
Dictionary<Key, string> dic = new Dictionary<Key, string>();
dic.Add(Key.A(EnKey1.A1,EnKey2.B19), "test");
Console.WriteLine(dic[Key.A(EnKey1.A1,EnKey2.B19)]);
// outputs "test"
// then you can do:
// dic.ContainsKey(Key.A(EnKey1.A1,EnKey2.B19)) -> true
// dic.ContainsKey(Key.A(EnKey1.A2,EnKey2.B19)) -> false