VB.NET (или C #) создает словарь из существующего списка без зацикливания - PullRequest
2 голосов
/ 31 августа 2011

Я не знаю, выполнимо ли это, может быть с Linq, но у меня есть List(Of MyType):

Public Class MyType

    Property key As Char
    Property description As String
End Class

И я хочу создать Dictionary(Of Char, MyType), используя поле ключа в качестве ключей словаря и значения в List в качестве значений словаря, с чем-то вроде:

New Dictionary(Of Char, MyType)(??)

Даже если это выполнимо, внутренне оно будет перебирать все элементы списка, я полагаю?

Ответы [ 3 ]

7 голосов
/ 31 августа 2011

Эта цель выполняется методом расширения ToDictionary :

Dim result = myList.ToDictionary(Function (x) x.key, Function (x) x.description)

Даже если это выполнимо, внутренне оно будет перебирать все элементы списка, я полагаю?

Конечно. На самом деле реализация без цикла является мыслимой, но может привести к очень неэффективному поиску словаря (такая реализация создаст представление в существующем списке вместо копия). Это жизнеспособная стратегия только для очень небольших словарей (скажем, <10 наименований). </p>

2 голосов
/ 31 августа 2011

В C # есть ToDictionary<TKey, TSource>, но да, он будет зацикливаться: -)

Вы бы назвали его чем-то вроде: myCollection.ToDictionary(p => p.key).В VB.NET я думаю, что синтаксис myCollection.ToDictionary(Function(p) p.key)

2 голосов
/ 31 августа 2011

Да, он будет проходить по всем элементам списка. Еще одна вещь, которую вы можете сделать, это создать KeyedCollection для вашего списка:

public class MyTypeCollection : KeyedCollection<char, MyType>
{
   protected override char GetKeyForItem(MyType item)
   {
      return item.key;
   }
}

но это не поможет вам добавить элементы.

...