본문 바로가기
C#/Common

C# Dictionary sort 정렬하는 방법

by 샤나엘 2021. 6. 7.
반응형

데이터를 가지고 있게 할 때 

찾는 값을 빨리 가져올 수 있게 하려고

Dictionary를 자주 사용하게 됩니다.

 

좋긴한데, 이 컬렉션을 정렬하고 싶은데 잘 안되서 막막할때가 있더라고요.

 

찾아보니 Dictionary값을 KeyValuePair의 형태로 List에 넣어서 정렬을 하니까 쉽게 처리가 되었습니다.

 

아래는 그 예시입니다.

 

Dictionary를 하나 선언하고, C, B, A, E, D와 순서로 데이터 값을 등록합니다.

            Dictionary<string, double> dic = new Dictionary<string, double>();
            dic.Add("C", 1);
            dic.Add("B", 4);
            dic.Add("A", 7);
            dic.Add("E", 2);
            dic.Add("D", 5);

값을 확인해보면 아래와 같이 들어있게되죠.

이 값을 A, B, C, D, E 순서로 정렬하고 싶은데, Dictionary는 순서를 보장해주지 않아서

이 값을 List에 넣고 정렬을 해야 합니다.

 

List에 값을 넣을땐 아래와 같이 선언해서 넣어주면 됩니다.

List<KeyValuePair<string, double>> list = new List<KeyValuePair<string, double>>(dic);

이제 List에 있는 값들을 정렬해야하는데, 정렬하는 많은 방법이 있겠지만 IComparer 클래스를 하나 선언해서 정렬하겠습니다.

 

아래처럼 Comparer 클래스를 하나 만들어 둡니다.

    public class DicComparer : IComparer<KeyValuePair<string, double>>
    {
        public int Compare(KeyValuePair<string, double> x, KeyValuePair<string, double> y)
        {
            int cmp = 0;

            cmp = x.Key.CompareTo(y.Key);

            return cmp;
        }
        public DicComparer()
        {

        }
    }

이제 List에서 아래와 같이 설정해둔 클래스를 호출해서 정렬을 하면 됩니다.

list.Sort(new DicComparer());

디버깅을 걸어서 보면 정렬된 모습을 볼 수 있습니다.

 

전체코드는 아래와 같습니다.

참고로 보시면 좋을 듯 하네요.

using System;
using System.Collections.Generic;
using System.Windows.Forms;

namespace WindowsFormsApp4
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            Dictionary<string, double> dic = new Dictionary<string, double>();
            dic.Add("C", 1);
            dic.Add("B", 4);
            dic.Add("A", 7);
            dic.Add("E", 2);
            dic.Add("D", 5);

            List<KeyValuePair<string, double>> list = new List<KeyValuePair<string, double>>(dic);

            list.Sort(new DicComparer());
        }
    }

    public class DicComparer : IComparer<KeyValuePair<string, double>>
    {
        public int Compare(KeyValuePair<string, double> x, KeyValuePair<string, double> y)
        {
            int cmp = 0;

            cmp = x.Key.CompareTo(y.Key);

            return cmp;
        }
        public DicComparer()
        {

        }
    }
}
반응형

'C# > Common' 카테고리의 다른 글

[C#] Enum foreach - Enum(열거형) 반복문 사용법  (0) 2018.04.05
[C#] Dictionary 사용예제  (0) 2018.04.02
[C#] DataTable 사용법  (0) 2018.03.28
[C#] Color  (0) 2018.03.20
[C#] Random Class 사용  (0) 2018.03.20

댓글