리스트, 딕셔너리 임의정렬 하기 정렬순서 sort order compare
mssql 에 임의 정렬하는 방법은 아래
2016/02/17 - [프로그램 자료/MS-SQL] - MSSQL Order by 임의정렬 정렬순서 조정하기
닷넷에서 리스트 또는 딕셔너리에 대해서 임의 정렬할 일이 생겼다.
찾아보니 아래와 같은 방법으로도 되더라.
저 델리게이트 부분만 따로 빼서 관리할 수 있을거 같은데...
using System;
using System.Collections.Generic;
using System.IO;
using System.Reflection;
using System.Text;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
//정렬할 임의 리스트 생성
List<string> list = new List<string>
{
"ConsoleApplication1._03.tab.TableName.data.sql"
, "ConsoleApplication1._03.tab.TableName.fk.sql"
,"ConsoleApplication1._03.tab.TableName.ix.sql"
,"ConsoleApplication1._03.tab.TableName.pk.sql"
,"ConsoleApplication1._03.tab.TableName.table.sql"
,"ConsoleApplication1._03.tab.TableName.trigger.TriggerTableNameDelete.sql"
,"ConsoleApplication1._03.tab.TableName.trigger.TriggerTableNameInsert.sql"
};
//정렬 방법 - return 값은 -1,0,1 로 해야한다
list.Sort(delegate(string A, string B)
{
Dictionary<string, int> dic = new Dictionary<string, int>
{
{"data.sql", 5}
,{"fk.sql", 4}
,{"ix.sql", 3}
,{"pk.sql", 2}
,{"table.sql", 1}
};
int ia, ib = 0;
if (A.Contains("table.sql"))
ia = dic["table.sql"];
else if (A.Contains("pk.sql"))
ia = dic["pk.sql"];
else if (A.Contains("ix.sql"))
ia = dic["ix.sql"];
else if (A.Contains("fk.sql"))
ia = dic["fk.sql"];
else if (A.Contains("data.sql"))
ia = dic["data.sql"];
else
ia = 10;
if (B.Contains("table.sql"))
ib = dic["table.sql"];
else if (B.Contains("pk.sql"))
ib = dic["pk.sql"];
else if (B.Contains("ix.sql"))
ib = dic["ix.sql"];
else if (B.Contains("fk.sql"))
ib = dic["fk.sql"];
else if (B.Contains("data.sql"))
ib = dic["data.sql"];
else
ib = 10;
if (ia > ib) return 1;
else if (ia < ib) return -1;
return 0;
});
//출력
foreach (string s in list)
{
Console.WriteLine(s);
}
Console.Read();
}
}
}
아래와 같이 델리게이트를 정의한 후 사용도 가능하다
//아래와 같이 델리게이트를 정의해놓고 사용하는 것도 가능하다
//Comparison<MyType> c = delegate(MyType t1, MyType t2){ ... };
Comparison<string> c = delegate(string A, string B)
{
Dictionary<string, int> dic = new Dictionary<string, int>
{
{"data.sql", 5}
,{"fk.sql", 4}
,{"ix.sql", 3}
,{"pk.sql", 2}
,{"table.sql", 1}
};
int ia, ib = 0;
if (A.Contains("table.sql"))
ia = dic["table.sql"];
else if (A.Contains("pk.sql"))
ia = dic["pk.sql"];
else if (A.Contains("ix.sql"))
ia = dic["ix.sql"];
else if (A.Contains("fk.sql"))
ia = dic["fk.sql"];
else if (A.Contains("data.sql"))
ia = dic["data.sql"];
else
ia = 10;
if (B.Contains("table.sql"))
ib = dic["table.sql"];
else if (B.Contains("pk.sql"))
ib = dic["pk.sql"];
else if (B.Contains("ix.sql"))
ib = dic["ix.sql"];
else if (B.Contains("fk.sql"))
ib = dic["fk.sql"];
else if (B.Contains("data.sql"))
ib = dic["data.sql"];
else
ib = 10;
if (ia > ib) return 1;
else if (ia < ib) return -1;
return 0;
};
//정렬 방법 - return 값은 -1,0,1 로 해야한다
list.Sort(c);
뭔가 간략한 버전이 필요할 것 같아 추가로 남긴다.
List<HtmlTag> sub = tags.FindAll(x => x.PID == id);
sub.Sort(delegate (HtmlTag a, HtmlTag b)
{
if (a.No > b.No)
return 1;
else if (a.No < b.No)
return -1;
return 0;
});
클래스의 경우 여러가지 경우에 따라서 조건을 줄 수 있다.
db의 order by , , , 같은 순으로가 가능하다.
public static Comparison<GFilter> Sorting = delegate(GFilter a, GFilter b)
{
if (a.Group.CompareTo(b.Group) != 0)
return a.Group.CompareTo(b.Group);
else
{
if (a.IsGroup.CompareTo(b.IsGroup) != 0)
return a.IsGroup.CompareTo(b.IsGroup);
else
{
return a.FilterName.CompareTo(b.FilterName);
}
}
};