[c#] 숫자 인덱스를 통해 Dictionary.Keys 키에 액세스

키가 있는 Dictionary<string, int>곳을 사용하고 int있습니다.

이제 사전 내에 마지막으로 삽입 된 키에 액세스해야하지만 그 이름을 모릅니다. 명백한 시도 :

int LastCount = mydict[mydict.keys[mydict.keys.Count]];

Dictionary.Keys[] -indexer를 구현하지 않기 때문에 작동하지 않습니다.

비슷한 수업이 있는지 궁금합니다. 스택 사용에 대해 생각했지만 문자열 만 저장합니다. 이제 내 자신의 구조체를 만든 다음을 사용할 수 Stack<MyStruct>있지만 키에 [] -indexer를 구현하는 또 다른 대안, 사전이 있는지 궁금합니다.



답변

@Falanwe가 주석에서 지적했듯이 이와 같은 작업은 올바르지 않습니다 .

int LastCount = mydict.Keys.ElementAt(mydict.Count -1);

당신은 사전에있는 키의 순서에 따라 달라집니다. 주문이 필요한 경우이 답변 에서 제안한대로 OrderedDictionary를 사용해야합니다 . 이 페이지의 다른 답변들도 흥미 롭습니다.


답변

OrderedDictionary 를 사용할 수 있습니다 .

키 또는 인덱스로 액세스 할 수있는 키 / 값 쌍 모음을 나타냅니다.


답변

사전은 해시 테이블이므로 삽입 순서를 모릅니다.

마지막으로 삽입 된 키를 알고 싶다면 LastKeyInserted 값을 포함하도록 사전을 확장하는 것이 좋습니다.

예 :

public MyDictionary<K, T> : IDictionary<K, T>
{
    private IDictionary<K, T> _InnerDictionary;

    public K LastInsertedKey { get; set; }

    public MyDictionary()
    {
        _InnerDictionary = new Dictionary<K, T>();
    }

    #region Implementation of IDictionary

    public void Add(KeyValuePair<K, T> item)
    {
        _InnerDictionary.Add(item);
        LastInsertedKey = item.Key;

    }

    public void Add(K key, T value)
    {
        _InnerDictionary.Add(key, value);
        LastInsertedKey = key;
    }

    .... rest of IDictionary methods

    #endregion

}

그러나 .Remove()이를 극복하기 위해 사용할 때 문제가 발생할 수 있으며 순서대로 정렬 된 키 목록을 유지해야합니다.


답변

마지막 키 삽입 속성에 추가하기 위해 사전 클래스를 확장하지 않는 이유는 무엇입니까? 다음과 같은 것이 있습니까?

public class ExtendedDictionary : Dictionary<string, int>
{
    private int lastKeyInserted = -1;

    public int LastKeyInserted
    {
        get { return lastKeyInserted; }
        set { lastKeyInserted = value; }
    }

    public void AddNew(string s, int i)
    {
        lastKeyInserted = i;

        base.Add(s, i);
    }
}


답변

당신은 항상 이것을 할 수 있습니다 :

string[] temp = new string[mydict.count];
mydict.Keys.CopyTo(temp, 0)
int LastCount = mydict[temp[mydict.count - 1]]

그러나 나는 그것을 추천하지 않을 것입니다. 마지막으로 삽입 된 키가 배열의 끝에있을 것이라는 보장은 없습니다. MSDN의 키 순서 는 지정되지 않았으며 변경 될 수 있습니다. 매우 간단한 테스트에서는 삽입 순서대로 보이지만 스택과 같이 적절한 부기장을 작성하는 것이 좋습니다. 최신 키만 알고 싶다면 단일 변수 캐시를 사용하십시오.


답변

나는 당신이 이런 식으로 할 수 있다고 생각합니다. 구문이 잘못되었을 수 있습니다. 한동안 C #을 사용하지 않았습니다. 마지막 항목을 얻으려면

Dictionary<string, int>.KeyCollection keys = mydict.keys;
string lastKey = keys.Last();

또는 Last 대신 Max를 사용하여 최대 값을 얻으려면 어느 것이 코드에 더 잘 맞는지 알 수 없습니다.


답변

Patrick의 답변의 두 번째 부분에 동의합니다. 일부 테스트에서 삽입 순서를 유지하는 것처럼 보이지만 설명서 (및 사전 및 해시의 일반적인 동작)에 명시 적으로 순서가 지정되지 않았습니다.

당신은 키의 순서에 따라 문제를 요구하고 있습니다. Patrick이 말했듯이 마지막 부기 키에 대한 단일 변수 인 자신의 부기를 추가하십시오. 또한 사전의 Last 및 Max와 같은 모든 방법으로 키 비교기와 관련이 있기 때문에 유혹을받지 마십시오 (확실하지 않습니다).