2010-03-02 9 views
0

У меня есть класс, как показано ниже, который хранит объект Uri, а также счетчик. Идея заключается в том, что я создаю список объектов UrlPackage для хранения ссылок, найденных при тралении домена и подсчета количества раз, когда они были найдены. Проблема заключается в том, как проверить, добавлен ли Uri в список.Поиск списка для проверки наличия дочернего объекта

Я использовал, чтобы хранить Ури непосредственно в списке поэтому используется только следующее:

linkList.Contains(Uri) 

Но теперь я хочу, чтобы найти, если UriPackage.UriObj существует в списке.

Я думаю, что linq - это путь вперед, но не уверен, как его использовать. Есть идеи?

class UrlPackage 
    { 
     private Uri _UriObj; 
     private int _Count; 

     public int Count 
     { 
      get { return _Count; } 
      set { _Count = value; } 
     } 

     public Uri UriObj 
     { 
      get { return _UriObj; } 
      set { _UriObj = value; } 
     } 
    } 

ответ

3

Вы должны использовать Dictionary<Uri, int> вместо списка.

Увеличивается количество на dict[uri]++; вы можете проверить наличие на dict.ContainsKey(uri).

Обратите внимание, что вам нужно будет проверить наличие перед добавлением нового uri: if (dict.ContainsKey(uri)) dict[uri]++ else dict[uri] = 1; (потому что в отличие от индексирования C++ ключом, отсутствующим в словаре, не допускается).

0

Используйте

Dictionary< UrlPackage, int > myList = new Dictionary< UrlPackage, int >(); 

если объект существует, увеличиваем его, если нет, то добавьте его и установите Int на 1 ....

if (myList.HasKey(item)) myList[ item ]++ 
else myList.Add(item,1); 
2

попробовать linkList.Any(x=>x.UriObj == uri)

Update: Как другие упомянутые словарь будет лучше для индексации и хранения этого. Однако вышеуказанное должно делать то, что вы хотите.

0
var objectExists = 
(from i in linkList where i.Uri = uriVarible select i).Any(); 
+0

Nevermind, другие ответы лучше. выражение Lamba confusedGeek является более сжатым способом использования Linq, но если вы беспокоитесь об эффективности, вы должны попробовать подход Dictionary –

0

Если вы обнаружите, что вы делаете много dict.ContainsKey(key) вы могли бы рассмотреть этот метод расширения.

public static TValue GetValue<TKey, TValue>(this IDictionary<TKey, TValue> source, TKey key) 
{ 
    TValue result; 
    return source.TryGetValue(key, out result) ? result : default(TValue); 
} 

и с помощью этого вы можете

var dic = new Dictionary<string, int>(); 
dic["test"] = dic.GetValue("test") + 1; 

Я на самом деле думаю, что должен быть общий словарь в C#, который имел такое поведение по умолчанию, так что вы могли бы написать

dic["test"]++; 

без получения исключение. Примером этого является то, как класс Hash в Ruby принимает необязательное значение по умолчанию, подобное этому

>> h = Hash.new(0) 
>> h["test"]+=1 
=> 1 
>> h["test"]+=1 
=> 2 
Смежные вопросы