C# 如何获取字典的键和值<;int,string>;从方法返回
我正在动态收集数据,我选择了C# 如何获取字典的键和值<;int,string>;从方法返回,c#,dictionary,C#,Dictionary,我正在动态收集数据,我选择了字典作为数据结构来存储这些数据 在方法的开头,我声明了一个变量: Dictionary<int, string> templatesKeyName = new Dictionary<int, string>(); 我想做一些事情,比如: if(Client.Accounts.Count > 0) { templatesKeyName.Add(GetTemplateForUserWithAccount()); } 显然,.Add()
字典
作为数据结构来存储这些数据
在方法的开头,我声明了一个变量:
Dictionary<int, string> templatesKeyName = new Dictionary<int, string>();
我想做一些事情,比如:
if(Client.Accounts.Count > 0)
{
templatesKeyName.Add(GetTemplateForUserWithAccount());
}
显然,
.Add()
扩展需要两个参数,但我无法找到如何从方法中传递值,而不先将结果赋给e临时字典,然后使用foreach
进行迭代,大多数时候我都会得到单个结果,所以迭代不是我真正考虑的。 你可以创建一个扩展方法:
public static void AddRange<T,K>(this Dictionary<T,K> source, IEnumerable<KeyValuePair<T,K>> values)
{
foreach(var kvp in values)
{
if(!source.ContainsKey(kvp.Key))
source.Add(kvp.Key, kvp.Value);
}
}
有趣。我试图找到实现了这个方法,为什么他们没有为
Dictionary
实现AddRange
。。。。然而,这对我来说是完美的。Thanks@Leron-使用列表
(其中已经实现了AddRange
),您可以有重复的条目。但是字典
不能有相同的键两次。那么,默认行为应该是什么呢?是否覆盖现有密钥的值?如果存在密钥,是否跳过?抛出异常?此实现选择“存在密钥时跳过”。但在其他地方覆盖可能更好。而且在其他地方抛出异常也是合适的。开发人员可能不想决定一个特定的标准实现。正如您所看到的,很容易创建自己的迭代。迭代必须在您的代码或您调用的方法中进行。foreach(GetTemplateForUserWithAccount()中的变量项)templatesKeyName.Add(item.Key,item.Value)有什么问题
?@adrianm不是出了什么问题,而是正如您从Selman22
答案中所看到的,仍然有一种方法可以将逻辑保持在一个位置,这样我就不必每次调用类似的方法时都编写迭代逻辑。另外,默认情况下,其他集合实现了AddRange
,因此我认为应该有更好的方法来添加这些值。现在,所有词典中都会突然添加一个.AddRange
。维护人员可能会在其他地方开始使用它,希望它能像.AddRangeReplaceExisting
一样工作,而实际上它是.AddRangeIfNotExists
。好的方法命名和文档编制当然可以解决这个问题,但值得这么麻烦吗。我会选择合适的名字。谢谢你!
public static void AddRange<T,K>(this Dictionary<T,K> source, IEnumerable<KeyValuePair<T,K>> values)
{
foreach(var kvp in values)
{
if(!source.ContainsKey(kvp.Key))
source.Add(kvp.Key, kvp.Value);
}
}
templatesKeyName.AddRange(GetTemplateForUserWithAccount());