2014-09-10 346 views
1

我需要将一个记录从一个字典复制到另一个,只有一个。我已经尝试了下面的内容,它不会复制一个,而是因为它在循环中的一切。而且我需要检查密钥是否已经被复制到第二个字典中,这就是为什么我通过第一个字典的原因。C#将一个记录从一个字典复制到另一个字典

foreach (int key in firstDict.Keys) 
    { 
     if (!secondDict.ContainsKey(key)) 
      secondDict.Add(key, firstDict[key]); 
     else {break;} 
    } 

请帮助,如果您需要更多的信息,请让我知道。

+0

您将不得不决定。如果你想复制*一个*条目,你需要知道它的关键。如果你已经知道为什么*所有*条目都被复制,为什么不修复它?要检查记录是否未被复制,只需使用“ContainsKey”。字典不是列表 - 每个密钥只能出现一次。 – 2014-09-10 08:42:19

+0

你想复制一个单一的条目,但你的意思是任何条目? – 2014-09-10 08:43:13

+0

如果第一个词典中的任何键已经在第二个词典中,您确定要让该foreach停止吗? (因为'else'会这样做) – 2014-09-10 08:44:10

回答

4

试试这个:

例如这里我将它的值设置为3

int key = 3; 

if (!secondDict.ContainsKey(key)) 
      secondDict.Add(key, firstDict[key]); 

编辑

foreach (int key in firstDict.Keys) 
{ 
    if (!secondDict.ContainsKey(key)) 
     { 
     secondDict.Add(key, firstDict[key]); 
     break; 
     } 
} 
+0

其中只复制第一个词条不在第二个词典中。如果这就是OP所要求的... – 2014-09-10 08:43:11

+1

谢谢duDE现在这个工作像魔术一样。我的问题是没有打破循环,这就是为什么我要复制多个记录。 – 2014-09-10 08:51:39

1

我想你在某个变量中有那一行的关键字,我会叫key。如果你只想要的任何一个条目中不存在存在于secondDict :

foreach (KeyValuePair<int, MyValueType> kvp in firstDict) //Replace MyValueType with the real value type in firstDict 
{ 
    if (!secondDict.ContainsKey(kvp.Key)) 
     { 
     secondDict.Add(kvp.Key, kvp.Value); 
     break; 
     } 
} 
+0

不,我没有一个变量的关键,我正在从firstDict中获取密钥,这就是为什么我要循环它。 – 2014-09-10 08:43:08

+0

所以你想要任何不在secondDict!中的单个条目? – 2014-09-10 08:44:12

+0

@主大卫检查增加编辑 – 2014-09-10 08:49:27

1

删除else子句

foreach (int key in firstDict.Keys) 
{ 
    if (!secondDict.ContainsKey(key)) { 
     secondDict.Add(key, firstDict[key]); 
     break; 
    } 
} 
3

比已发布的其他答案更有效率(保存一个字典查找)。

foreach(var kvp in firstDict) 
{ 
    if(!secondDict.ContainsKey(kvp.Key)) 
    { 
     secondDict[kvp.Key] = kvp.Value; 
     break; 
    } 
} 

如果你熟悉LINQ,你可能希望避免整个foreach ... break模式。这种模式非常丑陋,更重要的是令人困惑:看起来你想复制一切,当你真的想复制一个。你的问题本身就是证明它有多混淆的证明:如果你没有得到一个简单的模式,那可能意味着模式不是很好。以下内容将完成这项工作,并且很清楚它只会将第一个字典中的一个(最多)条目添加进去。

var missingEntry = firstDict 
    // cast beacause KeyValuePair is a struct and I want to detect the case where there is no missing entry 
    .Cast<KeyValuePair<TKey,TValue>?>() 
    .FirstOrDefault(kvp => !secondDict.ContainsKey(kvp.Key)); 

// check whether there truely is a missing entry. 
if (missingEntry != null) 
{ 
    secondDict[missingEntry.Key] = missingEntry.Value; 
}