2009-08-05 4 views
15

나는 약간의 샘플 코드를보고 있었고 작은 데이터 (약 5-10 개 정도의 오브젝트가 있지만이 숫자는 시간이 지남에 따라 바뀔 수 있음)를 저장하기 위해 ListDictionary 오브젝트를 사용했다. 이 수업을 사용하면서 내가 가진 유일한 문제는, 내가 해왔 던 모든 것과는 달리, 일반적이지 않다는 것입니다. 이 말은, 내가 틀렸다면 나에게 정정해라. 내가 여기에서 물건을 꺼내거나 열거 할 때마다 계속해서 캐스팅이 진행된다는 것을 의미한다. 오버 헤드가 비 의 오버 헤드를 정당화하기 위해 더 큰 Dictionary<T> 개체에 충분히 있습니까?ListDictionary 클래스에 대한 일반적인 대안이 있습니까?

이 개체를 사용할 코드는 각각의 페이지로드에서 열거됩니다. 다른로드 중 하나에서 ListDictionary 클래스가 사용 된 것 같습니다. 이것은 또한 왜이 데이터 목록에서 가장 뛰어난 성능을 원합니다.

+0

결론을 내리고 성능 측정을 수행 했습니까? 컬렉션에 소수의 항목 만있을 때 항상'Dictionary '을 사용하여 나를 귀찮게하지만 그곳에있는 편리함은 다른 것을 선택하거나 쓰는 것과 관련된 귀찮은/위험보다 항상 중요합니다. 그렇지 않으면 성능면에서는 큰 문제가 아닙니다. – Rory

답변

10

불행히도 ListDictionary에는 해당하지 않습니다.

그러나 구현하기가 너무 어렵지 않아야합니다. ListDictionary는 기본적으로 키/값 쌍의 연결된 목록을 유지하고 조회 작업을 위해 반복합니다. LinkedList<T>을 매우 단순한 LINQ 표현식으로 묶어 ListDictionary<TKey,TValue>을 만들 수 있습니다. 예를

public class LinkedDictionary<TKey,TValue> { 
    private LinkedList<KeyValuePair<TKey,TValue>> _list = new LinkedList<KeyValuePair<TKey,TValue>>(); 
    private IEqualityComparer<TKey> _comp = EqualityComparer<TKey>.Default; 

    public void Add(TKey key, TValue value) { 
    _list.Add(new KeyValuePair<TKey,TValue>(key,value)); 
    } 
    public TValue Get(TKey key) { 
    return _list.Where(x => _comp.Equals(x.Key,key)).First().Value; 
    } 
    ... 
} 
+4

LINQ를 사용하면 해시 코드를 계산하는 데 드는 비용이 너무 비싸지 않다면 ListDictionary를 사용하여 거의 모든 성능 이점을 무효화 할 수 있다고 생각합니다. – Chuu

+0

@Chuu 그러나 ListDictionary는 값에 액세스 할 때 이미 각 키에서 Equals를 호출하므로 LINQ의 성능에 부정적인 영향을주는 이유는 무엇입니까? – sluki

+1

@sluki for 루프를 포함하는 단일 메소드 대 객체 할당 및 위임 호출. LINQ는 프레임 워크 코드가 아닌 가독성을위한 것입니다. – jnm2

4

ListDictionary에 저장하는 데이터가 값 형식이 아닌 항상 개체 (클래스) 인 경우 사전 <T>보다 빠를 것입니다. 값 유형 (structs, int, double 등)을 저장하는 경우 boxing/unboxing의 비용이 대부분 균형을 맞추기 때문에 이라는 사전을 대신 추천합니다.

그러나이 두 가지 성능 차이는 전반적으로 성능 문제가 가장 적은 것으로 보입니다. 이와 같은 작은 것들은 일반적으로 성능 최적화와 관련하여 걱정할 마지막 사항입니다. 프로세스 간 호출, 데이터베이스 및 웹 서비스 상호 작용 등과 같은 더 큰 규모의 작업은 ListDictionary와 사전 <T> 사이의 사소한 성능 차이를 염려하기 전에 먼저 처리해야합니다.

+0

나는 성능 측면에서 더 큰 걱정거리가 있다는 것에 전적으로 동의한다. 이 질문에 대한 이유는 내가 지금 살펴보고 프로젝트에 추가하는 것입니다. 그래서 내가 ListDictionary 클래스에 대한 더 나은 대안을 사용할 수 있다면, 그대로 두는 것이 낫다는 것을 알 수 있습니다. –

1

를 들어

MSDN-ListDictionary 클래스의 간단한 검사 이것은 단일 연결 목록을 사용하여 IDictionary의 간단한 구현

을 발표 할 예정이다. 요소 수가 10 이하인 경우 해시 테이블보다 작고 빠릅니다. 큰 숫자의 경우 성능이 중요 할 경우이 값을 사용하지 마십시오.

1

우리가 사용할 수있는,

예를 들어
System.Collections.Generic.Dictionary<Object,Object> dictTemp = new System.Collections.Generic.Dictionary<Object,Object>(); 

using System.Collections.Specialized; 

    private ListDictionary g_Attributes = new ListDictionary(); 
    public ListDictionary Attributes 
    { 
     get { return this.g_Attributes; } 
    } 
    public string GetAttribute(string name) 
    { 
     if (HasAttribute(name)) 
      return (string) g_Attributes[name]; 
     else 
      return null; 
    } 
    public bool HasAttribute(string name) 
    { 
     return this.Attributes.Contains(name); 
    } 


    using System.Collection.Generic; 

    private Dictionary<string, object> g_Attributes = new Dictionary<string, object>(); 
    public Dictionary<string, object> Attributes 
    { 
     get { return this.g_Attributes; } 
    } 
    public string GetAttribute(string name) 
    { 
     if (HasAttribute(name)) 
     { 
      return g_Attributes[name].ToString(); 
     } 
     else 
     { 
      return null; 
     } 
    } 
    public bool HasAttribute(string name) 
    { 
    return this.Attributes.ContainsKey(name); 
    } 

내가이 당신에게 약간의 도움이 될 것입니다 생각, 다음 사항을 고려!

1

ListDictionary의 일반적인 동등 물은 없습니다.이 작은 사전의 사용이 AddRemove에 의해 지배되지 않는 경우

, 당신은, 그 이름에도 불구하고, IDictionary<TKey, TValue>를 구현 SortedList<TKey, TValue> 고려할 수 있습니다. 단일 링크리스트에 의해 보조되는 ListDictionary와는 달리, SortedList는 소트 된 키와 배열의 값의 배열에 의해 뒷받침됩니다.

+0

나는 이것이 지금까지 가장 좋은 대답이라고 생각한다. –

관련 문제