Как преобразовать список словарей с уникальными ключами в словарь, значением которого является список? - PullRequest
0 голосов
/ 13 октября 2011

У меня есть произвольное количество словарей (которые есть в списке, уже в порядке), к которым я хочу подключиться.Например, для N = 2:

List<Dictionary<string, int>> lstInput = new List<Dictionary<string, int>>();
Dictionary<string, int> dctTest1 = new Dictionary<string, int>();
Dictionary<string, int> dctTest2 = new Dictionary<string, int>();
dctTest1.Add("ABC", 123);
dctTest2.Add("ABC", 321);
dctTest2.Add("CBA", 321);
lstInput.Add(dctTest1);
lstInput.Add(dctTest2);

Каждый словарь уже имеет уникальные ключи.

Я хочу преобразовать lstInput в:

Dictionary<string, int[]> dctOutput = new Dictionary<string, int[]>();

где dctOutput выглядит следующим образом:

"ABC": [123, 321]
"CBA": [0, 321]

То есть набор ключей dctOutput равен объединению набора ключей каждого словаря в lstInput;более того, * i * th-позиция каждого значения в dctOutput равна значению соответствующего ключа в * i * th-словаре в lstInput или 0, если соответствующего ключа нет.

Как мне написать C # код для этого?

1 Ответ

0 голосов
/ 13 октября 2011

Следующее должно делать то, что вы хотите.

var dctOutput = new Dictionary<string, int[]>();
for (int i = 0; i < lstInput.Count; ++i)
{
    var dict = lstInput[i];
    foreach (var kvp in dict)
    {
        int[] values;
        if (!dctOutput.TryGetValue(kvp.Key, out values))
        {
            // Allocating the array zeros the values
            values = new int[lstInput.Count];
            dctOutput.Add(kvp.Key, values);
        }
        values[i] = kvp.Value;
    }
}

Это работает, потому что выделение массива инициализирует все значения равными 0. Так что, если в предыдущем словаре не было элемента с этим ключом, его значения будутбыть 0 в этой позиции.Если вы хотите, чтобы значение вашего Sentinel отличалось от 0, вы должны инициализировать массив этим значением после его выделения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...