Как я могу найти в строго типизированном списке строку? - PullRequest
3 голосов
/ 14 марта 2012

Как я могу "искать" в строго типизированном списке строку?

Я пытаюсь .Contains (TheString), однако он сообщает, что не может привести объект типа System.String к типу o7thCrawler.Typing.ImportantTyping '

Вот код:

Public Class LinkTyping
    Public Property Url As String
    Public Property Title As String
    Public Property Content As String
End Class

If Not (_InternalUrls.Contains(_Url & _Link)) Then
    _InternalUrls.Add(New Typing.LinkTyping() With {
                                                          .Url = _Url & _Link,
                                                          .Content = Item.Value,
                                                          .Title = If(Item.Attribute("title") IsNot Nothing,
                                                                      Item.Attribute("title").Value,
                                                                      Nothing)
                                                      })
End If

Ответы [ 3 ]

2 голосов
/ 14 марта 2012

Вы пытаетесь вставить 2 типа в один и тот же список ...

Какой тип InternalUrls?

Это:

If Not (_InternalUrls.Contains(_Url & _Link)) Then

подразумевает, что это IList(Of String)

но это:

_InternalUrls.Add(New Typing.LinkTyping() With {

Затем пытается добавить новый экземпляр вашего класса LinkTyping к нему ...

Как насчет чего-то вроде ...

Сделать InternalURLs быть List(Of LinkTyping)

Тогда

Dim MyUrl = String.Format("{0}{1}", _Url, _Link)
If Not InternalURLs.Any(function(x) x.Url = MyUrl) Then
    InternalURLs.Add(New Typing.LinkTyping() With {<Blah>})

End If

NB. Приведенное выше решение предполагает, что URL-адреса будут соответствовать одному и тому же регистру в целях сопоставления (как и в вашем примере, если нет перегруженного оператора сравнения) - вы можете использовать сравнение без учета регистра ...

If Not InternalURLs.Any(function(x) String.Equals(x.Url, MyUrl, StringComparison.OrdinalIgnoreCase)) Then
1 голос
/ 14 марта 2012

На самом деле это довольно просто сделать с помощью лямбда-выражения:

If _InternalUrls.Any(Function(l) l.Url = _Url) Then
    ' Do Add Logic Here

Вверху вам понадобится следующее:

Imports System.Linq

(Изменил FirstOrDefault наиспользуйте любой)

1 голос
/ 14 марта 2012

Предположим, что _InternalUrls является списком, тогда метод Contains будет использовать реализацию Equals объектов для принятия решения о том, находится ли объект уже в коллекции. Поэтому одним из вариантов будет перегрузка класса Equals для вас.

MSDN Link

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