Я заметил странную вещь VB.NET. Исходя из этого вопроса, я предоставил способ для доступа к ключам и значениям словарей KeysCollection
и ValuesCollection
через индекс, чтобы получить, скажем, первый элемент. Я знаю, что это имеет смысл только в SortedDictionary
, поскольку обычный Dictionary
не упорядочен (ну не стоит полагаться на его порядок).
Вот простой пример:
Dim sortedDict As New SortedDictionary(Of DateTime, String)
sortedDict.Add(DateTime.Now, "Foo")
Dim keys As SortedDictionary(Of DateTime, String).KeyCollection = sortedDict.Keys
Dim values As SortedDictionary(Of DateTime, String).ValueCollection = sortedDict.Values
Dim firstkey As DateTime = keys(0)
Dim firstValue As String = values(0)
Но я был удивлен, что автор вопроса сказал, что он не компилируется, тогда как у меня он компилируется и работает без проблем:
System.Diagnostics.Debug.WriteLine("Key:{0} Value:{1}", firstkey, firstValue) ' Key:04/29/2016 10:15:23 Value:Foo
Так почему я могу использовать его, как если бы в SortedDictionary(Of TKey, TValue).KeyCollection
-class, а также нет в ValueCollection
. Оба реализуют ICollection<T>
, который является родительским интерфейсом IList<T>
. Таким образом, вы можете зациклить его, и у него есть свойство Count
, но вы не можете получить доступ к элементам через индекс, как я сделал выше.
Обратите внимание, что это свежее консольное приложение без расширений внутри. Я тоже не могу перейти к определению индексатора (тоже не с решарпером). Почему это работает для меня?
Боковое примечание: это не работает на С#. Я получаю ожидаемую ошибку компилятора:
Невозможно применить индексирование с помощью [] к выражению типа SortedDictionary.KeyCollection.
var dict = new SortedDictionary<DateTime, string>();
dict.Add(DateTime.Now, "Foo");
DateTime dt = dict.Keys[0]; // here
Вот скриншот компиляции кода VB.NET: