2016-07-08 5 views
2

Как конвертировать словарь типа Dictionary<DateTime, double> в Tuple<List<DateTime>, List<double>>?Лучший способ конвертировать словарь в два списка

Благодаря

Edit: Есть ли следующие гарантии, что порядок элементов в обоих списках идентичен? var abc = new Tuple<List<DateTime>, List<double>>(_data.Keys.ToList(), _data.Values.ToList());

+0

можете посмотреть на [ 'Keys'] (https://msdn.microsoft.com/en-us/library/yt2fy5zk (V = vs.110) .aspx) и ['Значения'] (https://msdn.microsoft.com/en-us/library/ekcfxy3x (v = vs.110).aspx) свойства – grabthefish

+0

о порядке свойств 'Keys' и' Values' _ Порядок ключей в словаре .KeyCollection не указан, но это тот же порядок, что и соответствующие значения в словаре .ValueCollection, возвращаемое свойством Values_ снова из страниц msdn. – grabthefish

ответ

5

Simple (Заказ гарантировано):

Tuple<List<DateTime>, List<double>> tuple 
        = Tuple.Create(dict.Keys.ToList(), dict.Values.ToList()); 

порядок значений в Dictionary.ValueCollection не определен, но это тот же порядок, связанных ключей в словаре. KeyCollection , возвращаемый свойством Keys.

Источник: MSDN

Пример гарантии заказа:

заказа гарантируется даже после обновления, удаления и дополнения.

Dictionary<int, string> dict = new Dictionary<int, string>(); 

dict[2] = "2"; 
dict[1] = "0"; 
dict[3] = "3"; 
dict[1] = "1"; 
dict[1] = "1"; 

dict.Remove(3); 

var tuple = Tuple.Create(dict.Keys.ToList(), dict.Values.ToList()); 
// 2 1 
// "2" "1" 
+0

Спасибо за ваш ответ. Вы ответили сначала и предоставили идентичные решения, поэтому я отмечал это как ответ. –

2
var result = Tuple.Create(dict.Keys.ToList(), dict.Values.ToList()); 

В соответствии с приказом-вопрос в ваш комментарий:

В каком порядке вы получите не гарантировано, потому что словарь не упорядоченная коллекция. Но гарантировано, что вы получите то же самое в Keys - и Values -collection, и если вы используете foreach(KeyValuepair<DateTime,double> kv in dict).

MSDN: Keys:

Порядок ключей в словаре (Of TKey, TValue) .KeyCollection не определен, но такой же порядок, как и связанных с ними значений в словаре (Of TKey, TValue) .ValueCollection возвращается значением .

MSDN: Values:

Порядок значений в словарь (Of TKey, TValue) .ValueCollection не определен, но это того же порядка, соответствующих ключей в словаря (TKey, TValue) .KeyCollection возвращается ключом .

Вы спросили:

Так, например, dict[result.Item1[5]] == result.Item2[5] держит?

Да, это гарантировано в соответствии с документацией выше

+0

Означает ли это, что порядок элементов в обоих списках соответствует исходному содержанию словаря? Если я вызываю 'result.Item1 [5] и result.Item2 [5]' оба элемента будут соответствовать одному из слов Словаря? Будет ли выполнено следующее? 'dict [result.Item1 [5] == result.Item2 [5]' –

+0

Я отправил пример выше –

+0

@MattWolf проверить мой ответ – user3185569