2012-01-06 1 views
13

Dictionary<TKey, TValue>에 요소를 삽입 할 수있는 방법이나 기술이있어 해당 항목이 해당 사전의 KeyCollection의 첫 번째 인덱스에 있음을 보장합니다. 예를 들어사전의 첫 번째 색인에 요소를 삽입하는 방법은 무엇입니까?

는 :

dic.Add("key", "value", 0); 
// where `0` is the index that `key` to be inserted. 

foreach(KeyValuePair<String, String> key in dic) 
{ 
    Console.WriteLine("{0} = {1}", key.Key, key.Value); 
} 

출력 : 어떤 도움이 아주 많이 감사합니다

key = value 
foo = baa 
a = b 

Dictionary<String, String> dic = foo.GetOutput(); 

// `dic` is something like: 

// {"foo", "baa"}, 
// {"a", "b"} 

내가 좋아하는 뭔가를해야합니다. 미리 감사드립니다!

+2

의 시작 부분에 요소를 삽입합니다 도와 드릴까요? Dictionary 콜렉션의 항목 순서는 유연하도록 (다시 정렬 할 수 있습니다.) 인덱스는 사용되지 않도록 숨겨져 있습니다. 필요에 따라 더 적절한 다른 유형의 콜렉션을 사용할 수 있습니다. –

답변

20

사전을 사용하지 않음.

Dictionary<TKey, TValue>은 해시 테이블로 구현됩니다.사전 내부 키의 위치는 해시 코드, 해시 코드가 내부 구조에 색인을 제공하기 위해 더 감소 된 방법 및 전적으로 구현 종속적 인 방식으로 삽입되는 순서에 따라 달라집니다.

사전을 구현하는 유일한 방법은 아닙니다. SortedDictionary<TKey, TValue>은 내부적으로 트리 구조를 사용하므로 항상 순서대로 키를 유지합니다. 이 경우 처음에 뭔가를 삽입 할 수 없으며, 대신 무언가를 삽입하여 적절한 위치에 놓습니다.

주문이 가장 관심이 있다면, puredictionary는 전혀 원하지 않습니다. 오히려 List<KeyValuePair<TKey, TValue>>을 원하거나 OrderedDictionary에 의해 제공되는 목록 및 사전의 기능을 모두 제공하는 구조가 필요합니다. 이것은 일반적인 것은 아니지만 쉽게 주변에 일반 래퍼를 만들 수 있습니다 (내부적으로 제네릭을 사용하는 것이 성능상의 이점을 제공하지는 않지만 유형 안전성을 제공합니다).

+0

그래서 'OrderBy'와 같은 메소드의 목적은 무엇입니까? (Linq 확장자). 열거 액세스 항목은 어떤 순서로 나타 납니까? – Keren

+0

@Keren 목적은 특정 기준에 따라 정렬 된 요소를 받고 그 중 열거 된 요소가 그 순서로 요소에 액세스하는 것입니다. (소스는 어떤 순서로든 액세스되며 순서가 완료되면 순서가 지정됩니다.) 어떻게 관련이 있는지 잘 모르겠습니다. –

+0

내가 말하고자하는 것은 사전에 '키'에 의존하지 않는 명령이 있다는 것입니다. 이런 이유로이 순서를 제어 할 수있는 방법이 필요합니다. 나는 그렇지 않다는 것을 이해한다. – Keren

2

Dictionary<TKey, TValue>은 본질적으로 순서가 없습니다 (오히려 순서는 예측할 수 없으므로 의존해서는 안됩니다). 일종의 주문을 원하면 다른 유형을 사용해야합니다. 요구 사항에 대해 알지 못하면 특정 유형을 추천하기가 어렵습니다.

2

Dictionary<TKey, TValue>은 주문할 수 없습니다.

대신 SortedDictionary<TKey, TValue>을 시도 할 수 있지만 별도의 색인이 아닌 Key에 의해 주문됩니다.

7

사전은 정렬되지 않습니다. 요소는 해시가 값의 위치를 ​​가리키는 키를 사용하여 검색해야합니다.

원하는 요소는 특정 색인에 삽입 할 수있는 List <KeyValuePair>입니다. 이 열거 때 정렬되지 않은 방식으로 값의 제시로

List<KeyValuePair<string, string>> list = dic.ToList(); 
list.Insert(0, new KeyValuePair<string, string>("a", "b")); 

foreach(KeyValuePair<string, string> pair in list) 
    Console.WriteLine("{0} = {1}", pair.Key, pair.Value); 
3

Dictionary<TKey, TValue> 불가능합니다. 순서를 제공하는 SortedDictionary<TKey, TValue>이 있지만 키 값에 대해 IComparer<TKey>을 직접 사용하면 순서가 지정됩니다. 여기에서 키는 이고 int을 기준으로 주문해야합니다. 이러한 유형 중 하나는 가능하지 않습니다.

이 특수한 의미론을 사용하여 새로운 유형을 구현해야한다고 생각합니다. 예를 들어.

class OrderedMap<TKey, TValue> { 
    private readonly Dictionary<TKey, TValue> _map = new Dictionary<TKey, TValue>(); 
    private readonly List<TKey> _list = new List<TKey>(); 

    public void Add(TKey key, TValue value) { 
    if (!_map.ContainsKey(key)) { 
     _list.Add(key); 
    } 
    _map[key] = value; 
    } 

    public void Add(TKey key, TValue value, int index) { 
    if (_map.ContainsKey(key)) { 
     _list.Remove(key); 
    } 
    _map[key] = value; 
    _list.Insert(index, key); 
    } 

    public TValue GetValue(TKey key) { 
    return _map[key]; 
    } 

    public IEnumerabe<KeyValuePair<TKey, TValue>> GetItems() { 
    foreach (var key in _list) { 
     var value = _map[key]; 
     yield return new KeyValuePair<TKey, TValue>(key, value); 
    } 
    } 
} 

참고이 전통적인 Dictionary<TKey, TValue>을 통해 일부가 아닌 사소한 성능 차이와 함께 않습니다. 예를 들어 AddRemove은 느립니다.

1

이것은 내 솔루션입니다. 아마도 최상의 솔루션은 아니지만 작동합니다. =)

public static ComboBox FillDropDownList(Dictionary<String, String> dictionary, ComboBox dropDown, String selecione) 
{ 
    var d = new SortedDictionary<String, String>(); 

    d.Add("0", selecione); 

    foreach (KeyValuePair<string, string> pair in dictionary) 
    { 
     d.Add(pair.Key, pair.Value); 
    } 

    dropDown.DataSource = new BindingSource(d, null); 
    dropDown.DisplayMember = "Value"; 
    dropDown.ValueMember = "Key"; 

    dropDown.SelectedIndex = 0; 

    return dropDown; 
} 
3

3 년 된 질문입니다. 그러나이 문제의 해결 방법을 찾았습니다.. 그것은 누군가가

Dictionary<String, String> dic = foo.GetOutput(); 

dic = (new Dictionary<string, string> {{"key","value"}}).Concat(dic).ToDictionary(k => k.Key, v => v.Value); 

이것은 사전을 사용 할 수 귀하의 요구 사항은 무엇 사전 :

+1

이것은 구현 세부 사항입니다. 사전이 크기가 내부 배열이기 때문에 첫 번째 항목이 첫 번째 항목으로 유지된다는 보장이없는 경우에도 마찬가지입니다. –

+0

@MJK 감사합니다.이 도움이 .. – Arnab

관련 문제