#c# #generics #dictionary
#c# #общие #словарь
Вопрос:
Можно ли добавить один словарь в другой, например:
Dictionary<string,int> d1=new Dictionary<string,int>()
{
{"abc",1}
{"def",2}
};
Dictionary<string,string> d2=new Dictionary<string,string>()
{
{"str","fgh"}
{"uyz","ghi"}
};
Мне нужно добавить d1
в d2
. Пожалуйста, обратите внимание, что словари имеют разные подписи.
Комментарии:
1. Какова ваша конечная цель? вам нужно их объединить?
2. Что вы на самом деле пытаетесь сделать? выполнение этого для вашего словаря сделало бы попытку извлечения значений полной проблемой
3. Что должно произойти, когда
d2
уже содержит{"def", "2"}
?
Ответ №1:
Это возможно только в том случае, если вы создаете одну и ту же подпись. Поэтому вам следует либо вернуться к object
или string
.
Просто перебирайте один из словарей (предпочтительно string,int
один) и добавляйте значения в другой, преобразуя его значения.
Ответ №2:
Вы могли бы использовать Concat
ToDictionary
.
var newPairs = d1
.Where(kv1 => !d2.ContainsKey(kv1.Key))
.Select(kv1 => new KeyValuePair<string, string>(kv1.Key, kv1.Value.ToString()));
d2 = d2.Concat(newPairs).ToDictionary(kv => kv.Key, kv => kv.Value);
Сначала Where
проверяется, содержит ли второй словарь уже заданный ключ из первого. Select
Преобразует значения в string
и создает KeyValuePair<string, string>
.
Ответ №3:
Если ваши значения могут иметь разные типы, вы можете создать третий словарь типа DIctionary<String, Object>
и добавить в него все элементы из ваших словарей.
Dictionary<string,int> d1=new Dictionary<string,int>()
{
{"abc",1}
{"def",2}
};
Dictionary<string,string> d2=new Dictionary<string,string>()
{
{"str","fgh"}
{"uyz","ghi"}
};
Dictionary<String, Object> combinedDict = new Dictionary<String, Object>();
foreach(var d1Item in d1)
combinedDict.Add(d1Item.Key, d1Item.Value);
foreach(var d2Item in d2)
combinedDict.Add(d2Item.Key, d2Item.Value);
Ответ №4:
Вы не можете добавить словарь в другой словарь, который содержит пары ключ-значение разных типов.
Однако, если вы решите, какие типы пар ключей и значений вы будете хранить, вы можете преобразовать одно в другое и добавить один словарь в другой.
Например, пусть у нас есть словарь с именем dictionaryA
:
Dictionary<string, int> dictionaryA = new Dictionary<string, int>();
и другой словарь называется dictionaryB
:
Dictionary<string, string> dictionaryB = new Dictionary<string, string>();
Допустим, также, что мы хотим добавить dictionaryA
в dictionaryB
и создать словарь, который будет содержать пары ключ-значение типов string
и string
соответственно. Тогда вы могли бы попробовать что-то вроде этого:
foreach(var key in dictionaryA)
{
// Check if the key is not contained in the keys collection of dictionaryB.
// If so, add the corresponding element of the dictionaryA to the dictionaryB.
if(!dictionaryB.Keys.Contains(key))
dictionaryB.Add(key, dictionaryA[key].ToString());
}
Комментарии:
1. Но вы можете преобразовывать значения.
2. Это точно. Я обновлю свой пост соответствующим образом.