[英]C# appending Dictionary
如何将字典附加到其他字典中?
Dictionary<string, DateTime> odict = new Dictionary<string, DateTime>();
//Liste tous les Clients EMAIL (3)
foreach (var TheClientID in TheClient.GetClient_Id(3))
{
Dictionary<string, DateTime> Temp = oEmail.VoirEML(TheClientID.Key);
//odict = odict.Concat(Temp).ToDictionary(pair => pair.Key, pair => pair.Value);
odict = odict.SelectMany(toto => Temp)
.ToLookup(pair => pair.Key, pair => pair.Value)
.ToDictionary(group => group.Key, group => group.First());
}
我想连接/追加字典,而无需输入两次。
我曾经为此写过一个扩展方法,因为我需要同样的方法。 最后一个参数决定遇到重复键时该怎么做。
Skip
表示保留源条目。
Overwrite
表示使用“其他”条目。
Throw
将引发异常。
public enum DuplicateKeyHandling
{
Skip,
Overwrite,
Throw
}
/// <summary>
/// Combines two dictionaries into one dictionary. The contents of the resulting dictionary depends on the <paramref name="duplicateKeyHandling"/> parameter.
/// </summary>
/// <typeparam name="TKey">The type of the keys in the dictionaries</typeparam>
/// <typeparam name="TValue">The type of the values in the dictionaries</typeparam>
/// <param name="this"></param>
/// <param name="other">The dictionary to combine this one with</param>
/// <param name="duplicateKeyHandling">Specifies how to react if the <paramref name="other"/> dictionary contains keys that are already in this dictionary</param>
/// <returns>A new dictionary containing the combined key-value-pairs of both source dictionaries</returns>
public static Dictionary<TKey, TValue> Combine<TKey, TValue>(this Dictionary<TKey, TValue> @this, Dictionary<TKey, TValue> other, DuplicateKeyHandling duplicateKeyHandling = DuplicateKeyHandling.Skip)
{
// EDIT: I added the "comparer" parameter so the resulting dictionary will
// use the same comparer as the first source dictionary
var result = new Dictionary<TKey, TValue>(@this, @this.Comparer);
foreach (KeyValuePair<TKey, TValue> kvp in other)
{
if (result.ContainsKey(kvp.Key))
{
if (duplicateKeyHandling == DuplicateKeyHandling.Overwrite)
{
result[kvp.Key] = kvp.Value;
}
if (duplicateKeyHandling == DuplicateKeyHandling.Throw)
{
throw new Exception("Duplicate key while combining dictionaries!");
}
}
else
{
result.Add(kvp.Key, kvp.Value);
}
}
return result;
}
我认为尝试使用Linq是错误的。 它很容易通过一个简单的循环来编写和阅读,而扩展方法将不会更加有效-可能效率更低。
Dictionary<string, DateTime> odict = new Dictionary<string, DateTime>();
//Liste tous les Clients EMAIL (3)
foreach(var TheClientID in TheClient.GetClient_Id(3)) {
Dictionary<string, DateTime> Temp = oEmail.VoirEML(TheClientID.Key);
//odict = odict.Concat(Temp).ToDictionary(pair => pair.Key, pair => pair.Value);
foreach(var kvp in Temp){
odict[kvp.Key] = kvp.Value;
}
}
我试试这个:
odict = odict.Concat(Temp.Where(kvp => !odict.ContainsKey(kvp.Key))).ToDictionary(x => x.Key, x => x.Value);
它工作正常
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.