2010-03-02 5 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

를 사용하여 A

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

오브젝트가 존재하는 경우,하지 않을 경우, 그것을 증가에 추가하고 1로 INT ....

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

linkList.Any(x=>x.UriObj == uri)

업데이트를 시도 : 다른 사람이 언급 한 바와 같이 사전 색인이 저장을위한 더 나은 것입니다. 그러나 위의 것은 당신이 원하는 것을해야합니다.

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

다른 답변이 더 좋지 않습니다. confusedGeek의 Lamba 표현은 Linq를 사용하는보다 간결한 방법이지만, 성능에 대해 걱정이된다면 사전 접근법을 시도해야합니다 –

0

당신이 확장 방법을 고려할 수 있습니다.

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

이를 사용 할 수 있습니다 내가 실제로받지 않고

dic["test"]++; 

를 작성할 수 있도록 기본적으로이 동작을 한 C#에서 일반적인 사전이 있어야한다고 생각

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

예외. 그 예가 Ruby의 Hash 클래스가 다음과 같은 선택적 기본값을 취하는 방법입니다.

>> h = Hash.new(0) 
>> h["test"]+=1 
=> 1 
>> h["test"]+=1 
=> 2 
관련 문제