[英]how to check key existence for dictionary within a dictionary in C#
在下面的代码中,如何检查字典中字典的键是否存在?
当前执行抛出键存在错误。
输出,对于键“ a”,另一个键“ X”的值分别为1和2
我们为此有更好的收藏吗?
var data = new Dictionary<string, Dictionary<string, object>>();
foreach (var j in GetTopData())
{
foreach (var p in BottomData())
{
if (data.Keys.Contains(j.ToString()))
{
data[j].Add(p.Name, p.Value);
}
else
{
data.Add(j, new Dictionary<string, object> { { p.Name, p.Value } });
}
}
}
这是数据类,
private static List<TempData> BottomData()
{
return new List<TempData>
{
new TempData{ Name="X", Value=1},
new TempData{ Name="X", Value=2}
};
}
private static List<string> GetTopData()
{
return new List<string> { "a"};
}
public class TempData
{
public string Name { get; set; }
public object Value { get; set; }
}
您的代码可以简化为:
var data = new Dictionary<string, Dictionary<string, List<object>>>();
foreach (var j in GetTopData())
{
foreach (var p in BottomData())
{
Dictionary<string, List<object>> values;
var existed = data.TryGetValue(j, out values);
if (!existed)
values = new Dictionary<string, List<object>>();
List<Object> list;
var existed2 = values.TryGetValue(p.Name, out list);
if (!existed2)
list = new List<object>();
list.Add(p.Value);
if (!existed)
data.Add(j, values);
if (!existed2)
values.Add(p.Name, list);
}
}
您需要检查两个字典中的现有数据。 目前,您只在检查一本字典中的存在性:
var data = new Dictionary<string, Dictionary<string, object>>();
foreach (var j in GetTopData())
{
foreach (var p in BottomData())
{
if(data.ContainsKey(j.ToString()))
{
var mydict = data[j.ToString()];
if (!mydict.ContainsKey(p.Name))
data[j].Add(p.Name, p.Value);
}
else
{
data.Add(j, new Dictionary<string, object> { { p.Name, p.Value } });
}
}
}
因为您需要一个键来包含多个值,所以Dictionary<string, Dictionary<string, object>>
对您不起作用(特定键只允许使用1个值)。 您可以使用Dictionary<string, Dictionary<string, List<object>>>
,但是它很难阅读且难以使用。 因此,我觉得最好使用Dictionary,将两个键组合为一个,如CombinedKey类中所示(在C#7.0中, ValueTuple<string, string>
也可以使用):
public class CombinedKey
{
public string Key1;
public string Key2;
// It is necessary to override Equals and GetHashCode to make
// it work properly as a dictionary key.
public override bool Equals(object obj)
{
var otherCombinedKey = obj as CombinedKey;
return otherCombinedKey != null
&& otherCombinedKey.Key1 == this.Key1
&& otherCombinedKey.Key2 == this.Key2;
}
public override int GetHashCode()
{
return Key1.GetHashCode() ^ Key2.GetHashCode();
}
}
然后以这种方式使用它:
Dictionary<CombinedKey, List<object>> data = new Dictionary<CombinedKey, List<object>>();
foreach (var j in GetTopData())
{
foreach (var p in BottomData())
{
var key = new CombinedKey() { Key1 = j, Key2 = p.Name };
List<object> list;
if(!data.TryGetValue(key, out list))
{
data[key] = list = new List<object>();
}
list.Add(p.Value);
}
}
如果您的数据是不可变的,则还可以使用Lookup<CombinedKey, object>
类。
回答您的问题, 如何在C#中检查字典中字典的键是否存在 :
您可以使用Linq进行检查,例如以下示例 :
bool keyExistance = data.Any(x=>x.Value.ContainsKey(keyTocheck));
但是在此之前,您必须修复代码中的错误。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.