Прежде всего, это невозможно без циклов. Независимо от того, выполняется ли этот цикл в методе (расширения), он все еще требует цикла.
На самом деле я собираюсь рекомендовать делать это вручную. Для всех остальных приведенных ответов необходимо использовать два метода расширения (Concat - ToDictionary и SelectMany - ToDictionary) и, таким образом, выполнить цикл дважды. Если вы делаете это для оптимизации вашего кода, будет быстрее сделать цикл над словарем B и добавить его содержимое в словарь A.
Редактировать: После дальнейшего исследования операция Concat будет выполняться только во время вызова ToDictionary, но я все же думаю, что пользовательский метод расширения будет более эффективным.
Если вы хотите уменьшить размер кода, просто создайте метод расширения:
public static class DictionaryExtensions
{
public static IDictionary<TKey,TVal> Merge<TKey,TVal>(this IDictionary<TKey,TVal> dictA, IDictionary<TKey,TVal> dictB)
{
IDictionary<TKey,TVal> output = new Dictionary<TKey,TVal>(dictA);
foreach (KeyValuePair<TKey,TVal> pair in dictB)
{
// TODO: Check for collisions?
output.Add(pair.Key, Pair.Value);
}
return output;
}
}
Затем вы можете использовать его, импортировав («используя») пространство имен DictionaryExtensions и написав:
IDictionary<string,objet> output = dictA.Merge(dictB);
Я заставил метод вести себя так, как будто объекты неизменны, но вы можете легко изменить его, чтобы он не возвращал новый словарь и просто сливался в dictA.