Как скопировать значения IDictionary в объект IList в .Net 2.0? - PullRequest
3 голосов
/ 21 апреля 2009

Если у меня есть:

Dictionary<string, int>

Как мне скопировать все значения в:

List<int> 

Объект

Решение должно быть чем-то совместимым с версией 2.0 CLR и C # 2.0 - и у меня действительно нет лучшей идеи, кроме как перебирать словарь и добавлять значения в объект List по одному. Но это кажется очень неэффективным.

Есть ли лучший способ?

Ответы [ 4 ]

8 голосов
/ 21 апреля 2009

Вероятно, стоит отметить, что вам следует отступить и спросить себя, действительно ли вам нужны элементы, хранящиеся в списке со случайным индексированным доступом, или вам просто нужно время от времени перечислять каждый из ключей или значений.

Вы можете легко перебрать ICollection MyDictionary.Values.

foreach (int item in dict.Values) { dosomething(item); }

В противном случае, если вам действительно нужно сохранить его как IList, нет ничего особенно неэффективного в копировании всех элементов; это просто операция O (n). Если вам не нужно делать это так часто, зачем волноваться? Если вас раздражает написание кода для этого, используйте:

IList<int> x=new List<int>(dict.Values);

, который упаковывает код, который вы пишете, в конструктор копирования, который уже реализует код, который вы планировали написать. Это эффективно для строк кода, что, вероятно, то, что вы действительно заботитесь; это не более эффективное пространство или время, чем то, что вы написали бы.

5 голосов
/ 21 апреля 2009

Это должно работать даже на 2.0 (простите за C # 3.0 использование "var"):

var dict = new Dictionary<string, int>();
var list = new List<int>(dict.Values);
1 голос
/ 21 апреля 2009

Попробуйте следующее

public static class Util {
  public List<TValue> CopyValues<TKey,TValue>(Dictionary<TKey,TValue> map) {
    return new List<TValue>(map.Values);
  }
}

Затем вы можете использовать метод, подобный следующему

Dictionary<string,int> map = GetTheDictionary();
List<int> values = Util.CopyValues(map);
0 голосов
/ 21 апреля 2009

Если вы можете использовать IEnumerable<int> или ICollection<int> вместо List<int>, вы можете просто использовать коллекцию Value из словаря, не копируя ничего.

Если вам нужен List<int>, вам нужно скопировать все предметы. Конструктор списка может сделать всю работу за вас, но каждый элемент все еще должен быть скопирован, и нет никакого способа обойти это.

...