Использование KeyValuePair в VB.NET для словаря с возможностью обратного просмотра (пример подсказки в C # требует преобразования) - PullRequest
1 голос
/ 26 октября 2009

В настоящее время я работаю над проектом VB.NET и хочу использовать KeyValuePair для облегчения обратного поиска.

Я нашел отличный пример на C # здесь: http://www.dreamincode.net/forums/showtopic78080.htm, однако у меня возникла небольшая проблема при конвертации в VB.NET (как вручную, так и с помощью переводчика (онлайн-карлосаг)). Например, синтаксис, который я ожидал бы в методе Add, выглядит следующим образом:

    Public Sub Add(ByVal key As TKey, ByVal value As TValue)
        Me.Add(New KeyValuePair(Of Tkey(key, value))
    End Sub

Тогда как это говорит мне "Слишком мало аргументов типа для 'System.Collections.Generic.KeyValuePair (Of TKey, TValue)'"

Любая помощь, безусловно, будет полезна (в действительности, как и полный перевод примера, включая аноновые методы: D.

Ответы [ 3 ]

1 голос
/ 26 октября 2009

Я запустил пример, на который вы ссылались, с помощью инструмента, который я обычно использую для преобразования C # в VB.NET, по адресу www.developerfusion.co.uk/tools

Imports System 
Imports System.Collections.Generic 
Imports System.Text 
Namespace ConsoleApplication1 
    Class PairCollection(Of TKey, TValue) 
        Inherits List(Of KeyValuePair(Of TKey, TValue)) 
        Public Sub Add(ByVal key As TKey, ByVal value As TValue) 
            Me.Add(New KeyValuePair(Of TKey, TValue)(key, value)) 
        End Sub 
        Public Function FindByKey(ByVal key As TKey) As List(Of KeyValuePair(Of TKey, TValue)) 
            Return Me.FindAll(Function(ByVal item As KeyValuePair(Of TKey, TValue)) (item.Key.Equals(key))) 
        End Function 
        Public Function FindByValue(ByVal value As TValue) As List(Of KeyValuePair(Of TKey, TValue)) 
            Return Me.FindAll(Function(ByVal item As KeyValuePair(Of TKey, TValue)) (item.Value.Equals(value))) 
        End Function 
    End Class 
    Class Program 
        Private Shared Sub Main(ByVal args As String()) 
            Dim menu As New PairCollection(Of String, Double)() 
            menu.Add("Burger", 3.5R) 
            menu.Add("Hot Dog", 2.25) 
            menu.Add("Fries", 1.75) 
            Console.WriteLine(menu.FindByKey("Fries")(0)) 
            Console.ReadLine() 
        End Sub 
    End Class 
End Namespace 

Как видите, метод Add () несколько отличается от вашего.

0 голосов
/ 27 октября 2009

Решено созданием перегрузки метода Add следующим образом:

Public Overloads Sub Add(ByVal key As TKey, ByVal value As TValue)
   Me.Add(New KeyValuePair(Of TKey, TValue)(key, value))
End Sub

Странно, что, хотя MyBase.Add работает (найден с помощью декомпиляции в Reflector), Me не (несмотря на то, что это работает в C #) Я думаю, я объяснил это причудой в VB.NET?

Спасибо, Кевинв и Мета-Рыцарь. Исходный код был неправильным, но я все время наследовал от List.

0 голосов
/ 26 октября 2009

1 - Как указал Кевинв, ваш исходный код неверен, он должен быть:

Me.Add(New KeyValuePair(Of TKey, TValue)(key, value))

2- Код выше должен вставить новый KeyValuePair в PairCollection, который наследуется от List(Of KeyValuePair). Если это не сработает, есть большая вероятность, что ваша строка Inherits неверна. Согласно ошибке, метод Add ожидает ключ, а не KeyValuePair ... может быть, ваш унаследован от Dictionary вместо List?

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