퇴근5분전

 

 훈스 닷넷에 문의 글이 하나 올라왔다.

 

 "994.jpg", "995.jpg", "995-1.jpg", "995-2.jpg", "996.jpg", "997.jpg", "998.jpg", "998-1.jpg", "999.jpg", "1000.jpg", "1000-1.jpg",

 

정렬해야 되는데 '-' 들어간 것때문에 정렬이 이상하게 된다고...

 

Array.Sort를 이용하였다는 글이었다.

 

http://www.hoons.net/Board/qacshap/Content/60271

 

그래서 우선 간단하게 만들어본다고 시작하게 되었는데...

 

우선 첫번째 실수는 정렬에 대한 내용 이해를 잘못했다

 

994, 995, 1000, 995-1, 1000-1 형태로 정렬을 해야되는건가? 하고 코드를 시작했다.

 

답글을 보니 Lookw님은 처음 나열된 순서대로 나오도록 작성을 해 올리셨더라.

 

List<string> ls = new List<string>
{
    "1000-100","1000-99","998-1","999","999-0", "994","995","995-1",
    "999-1","1000","995-2","996","997","998"
};
var ls2 = ls.Select(x =>
{
    var subs = x.Split('-');
    if (subs.Length > 1)
        return new {Original=x, First = subs[0], Last = subs[1] };
    else
        return new {Original=x, First = subs[0], Last=string.Empty};
})
.OrderBy(x => int.Parse(x.First))
.ThenBy(x =>
{
if (x.Last != string.Empty)
    return int.Parse(x.Last);
else
    return 0;
})
.Select(x => x.Original);

 

그래서 나도 정렬 순서를 바꾸려고 코드를 수정했는데 1시간동안 수정했다.

string[] arr = new string[] {
                "994","995","995-1","995-2","996","997","998",
                "998-1","999","1000","1000-100","1000-99",
 //"994.jpg",
 //"995.jpg",
 //"995-1.jpg",
 //"995-2.jpg",
 //"996.jpg",
 //"997.jpg",
 //"998.jpg",
 //"998-1.jpg",
 //"999.jpg",
 //"1000.jpg",
 //"1000-1.jpg",
};

            int maxLenght = arr.Max(s => s.Replace(".jpg", "").Length);
            int hipen = 4;
            Func<string, string[]> Process = (s) =>
            {
                string[] NameExtensArray = s.Split(new char[] { '.' });
                string[] NameHipenArray = NameExtensArray[0].Split(new char[] { '-' });
                if (NameHipenArray.Length == 1)
                {
                    NameHipenArray = new string[] { NameHipenArray[0], "" };
                }
                return new string[] { NameHipenArray[0].PadLeft(maxLenght, '0'), NameHipenArray[1].PadLeft(hipen, '0').PadRight(hipen, '0'), NameExtensArray[NameExtensArray.LongLength - 1] };
            };

            Comparison<string> compare = (s1, s2) =>
            {
                string[] cv1 = Process(s1);
                string[] cv2 = Process(s2);
                return (cv1[0] + cv1[1]).CompareTo(cv2[0] + cv2[1]);
            };
            Array.Sort(arr, compare);

 

이렇게 작성해두고 잠깐 있으니 String.Format이 떠올랐다.

 

string k1 = string.Format("{0, 8}",  "995").Replace(" ","0");
string k2 = string.Format("{0, 8}", "1000").Replace(" ", "0");

요건 {0, 8} 같은 경우 8자리에 오른쪽 정렬, {0, -8}은 왼쪽 정렬

 

이걸로 다시... 코드를 작성!

 

 string[] arr2 = new string[] { 
         //"994","995","995-1","995-2","996","997","998",
         //"998-1","999","1000","1000-100","1000-99",
         "994.jpg",  "995.jpg",  "995-1.jpg",  "995-2.jpg",  "996.jpg",  "997.jpg",
         "998.jpg",  "998-1.jpg",  "999.jpg",  "1000.jpg",  "1000-1.jpg",

   };

         int maxLenght2 = arr2.Max(s => s.Replace(".jpg", "").Length);
         var result = from o in (arr2.Select(ars =>
         {
               string[] strings = ars.Replace(".jpg", "").Split('-');
               string opt = "0000";
               if (strings.Length > 1)
               {
                        opt = strings[1].Split('.')[0];
                }
                return new {

 key = ars,

             value = string.Format("{0," + maxLenght2 + " }",

            strings[0].Split('-')[0]).Replace(" ", "0")  +

           string.Format("{0, 4}", opt).Replace(" ", "0")

    }

   }))

         orderby o.value
         select o.key;

 

이게 뭐라고 금욜저녁에 필 꽃혀서리...

 

 

 

 

 

 

 

 

 

 

'# 1) 프로그래밍' 카테고리의 다른 글

알고리즘] 2  (0) 2013.11.15
알고리즘] 1  (0) 2013.11.14
.net] 모니터링 프로그램...  (0) 2012.05.13
.NET] 트리 뷰_ 체크박스 - 더블클릭  (0) 2012.04.09
.net ] 한글 유니코드 변환  (0) 2012.04.07