none
IDictionary<string, int> 부분에서 int값을 정렬시키는 방법 문의 RRS feed

  • 질문

  • public IDictionary<string, int> DIC{get;set;}

    여기에 값을 입력한 후,

    [0] Work,0

    [1] New,1

    [2] Pass,2

    ...

    [50] SSS,50

    와 같다고 하고

    후에 이렇게 변경시키게 된다면,

    [0] Work,1

    [1] New,2

    [2] Pass,0

    ...

    [50] SSS,50

    IDictionary<string, int> 부분에서 int값을 정렬시키는 방법이 있는지요?

    만약 정렬시키게 된다면,

    [0] Pass,0

    [1] Work,1

    [2] New,2

    ...

    [50] SSS,50

    와 같이 나와야 합니다.

    2012년 2월 17일 금요일 오전 11:59

답변

  • 공식적으로 그런 방법은 제공되지 않습니다.

    물론, 만들면 되겠지만 ... Dictionary 의 특성상 그 자체로 정렬 시킬 수 있는 자료 구조는 아니기 때문에 한번 꺼내서 정렬시킨 후 다시 넣어주어야 합니다.

    대략 만들어 보면... 다음과 같은 식으로 구현될 수 있습니다.

    public class TupleComparer : IComparer<Tuple<string, int>>
    {
        public int Compare(Tuple<string, int> x, Tuple<string, int> y)
        {
            return x.Item2.CompareTo(y.Item2);
        }
    }

    static void Main(string[] args)
    {
        Dictionary<string, int> dic = new Dictionary<string,int>();
        dic.Add("Work", 0);
        dic.Add("New", 1);
        dic.Add("Pass", 2);

        dic["Work"] = 1;
        dic["New"] = 2;
        dic["Pass"] = 0;

        Tuple<string, int> [] tuples = new Tuple<string, int>[dic.Count];
        int i = 0;
        foreach (var item in dic)
        {
            tuples[i] = new Tuple<string, int>(item.Key, item.Value);
            i++;
        }

        Array.Sort(tuples, new TupleComparer());
        dic.Clear();

        foreach (var item in tuples)
        {
            dic.Add(item.Item1, item.Item2);
        }
    }

    2012년 2월 17일 금요일 오후 4:20
  • SortedList 를 써보시기 바랍니다. ㅎ
    2012년 3월 27일 화요일 오전 1:59

모든 응답

  • 공식적으로 그런 방법은 제공되지 않습니다.

    물론, 만들면 되겠지만 ... Dictionary 의 특성상 그 자체로 정렬 시킬 수 있는 자료 구조는 아니기 때문에 한번 꺼내서 정렬시킨 후 다시 넣어주어야 합니다.

    대략 만들어 보면... 다음과 같은 식으로 구현될 수 있습니다.

    public class TupleComparer : IComparer<Tuple<string, int>>
    {
        public int Compare(Tuple<string, int> x, Tuple<string, int> y)
        {
            return x.Item2.CompareTo(y.Item2);
        }
    }

    static void Main(string[] args)
    {
        Dictionary<string, int> dic = new Dictionary<string,int>();
        dic.Add("Work", 0);
        dic.Add("New", 1);
        dic.Add("Pass", 2);

        dic["Work"] = 1;
        dic["New"] = 2;
        dic["Pass"] = 0;

        Tuple<string, int> [] tuples = new Tuple<string, int>[dic.Count];
        int i = 0;
        foreach (var item in dic)
        {
            tuples[i] = new Tuple<string, int>(item.Key, item.Value);
            i++;
        }

        Array.Sort(tuples, new TupleComparer());
        dic.Clear();

        foreach (var item in tuples)
        {
            dic.Add(item.Item1, item.Item2);
        }
    }

    2012년 2월 17일 금요일 오후 4:20
  • 안녕하십니까? code1004 ,

    Microsoft MSDNForum 사이트를 방문해 주셔서 감사합니다.

    문의 하신 ”IDictionary<string,int> 부분에서 int값을 정렬시키는 방법 문의 에 대해 답변드리겠습니다.

    제 생각에는 현재 Dictionary 자체 int값으로 정열하는 것에 대한 기능을 제공하고있지 않습니다.

    하지만 아래와같은 코드를 이용해보시길 바랍니다.


                Dictionary<string, int> dict = new Dictionary<string, int>();
                dict.Add("A", 3);
                dict.Add("B", 2);
                dict.Add("C", 1);

                List<KeyValuePair<string, int>> sorted = (from kv in dict orderby kv.Value select kv).ToList();

                foreach (KeyValuePair<string, int> kv in sorted)
                {
                    Console.WriteLine("{0}={1}", kv.Key, kv.Value);
                    // Prints:
                    // C=1
                    // B=2
                    // A=3
                }

    혹시 제가 문제에 대해 더 알아야 할 것이 있다면 응답 주시면 감사하겠습니다.

    제시해 드린 답변이 도움이 되었기를 바랍니다.

    답변이 문제 해결에 도움이 되었다면 답변으로 채택을 부탁드립니다. 하지만 문제 해결이 되지 않아서 정확한 답변을 원하는 경우에는 문제의 정보를 더 자세하게 답변으로 제공해주시기 바랍니다.


    2012년 2월 20일 월요일 오전 1:57
    중재자
  • SortedList 를 써보시기 바랍니다. ㅎ
    2012년 3월 27일 화요일 오전 1:59
  • SortedList 가 답이 될까요? ^^

    위에서 dictionary 에 보관되는 항목의 형식이 <string, int> 인데요. SortedList 는 Key 에 해당하는 것만 정렬을 합니다. 즉, string 이 정렬되기 때문에 질문자가 의도한 int 정렬과 상관이 없습니다.

    혹시 value를 기준으로 하는 SortedList 의 응용이 있는 건가요? ^^

    2012년 3월 27일 화요일 오전 2:07