Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/327.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何获取字典的键和值<;int,string>;从方法返回_C#_Dictionary - Fatal编程技术网

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());