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);

        }

    }

};




Posted by motolies
,