C#] 문자열 정렬처리...
훈스 닷넷에 문의 글이 하나 올라왔다.
"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 |