문자열이 숫자 일 때 값을 고려하면서 문자열을 알파벳순으로 정렬하는 방법은 무엇입니까?


100

문자열 인 숫자 배열을 정렬하려고하는데 숫자로 정렬하고 싶습니다.

문제 는 숫자를 int로 변환 할 수 없다는 것 입니다.

다음은 코드입니다.

string[] things= new string[] { "105", "101", "102", "103", "90" };

foreach (var thing in things.OrderBy(x => x))
{
    Console.WriteLine(thing);
}

출력 : 101, 102, 103, 105, 90

원하는 항목 : 90, 101, 102, 103, 105

편집 : 출력은 090, 101, 102 ... 일 수 없습니다.

"크기"대신 "사물"을 말하도록 코드 샘플을 업데이트했습니다. 배열은 다음과 같을 수 있습니다.

string[] things= new string[] { "paul", "bob", "lauren", "007", "90" };

즉, 알파벳순과 숫자 순으로 정렬해야합니다.

007, 90, 밥, 로렌, 폴


8
왜 그것들을 int로 변환 할 수 없습니까?
Femaref

1
"크기"는 "이름"과 같은 다른 것일 수 있습니다. 코드 샘플은 간단합니다.
sf.

2
음수일까요? 모두 정수일까요? 정수의 범위는 무엇입니까?
Eric Lippert

"사물"은 모든 종류의 문자열이 될 수 있습니다. 컴퓨터에 익숙하지 않은 사람에게 목록을 논리적으로 정렬하고 싶습니다. 음수는 postive 앞에 와야합니다. 문자열 길이는 100자를 넘지 않습니다.
sf.

5
얼마나 멀리 가고 싶습니까? 해야 image10후 온 image2? 해야 January전에 와서 February?
svick

답변:


104

사용자 지정 비교자를 OrderBy에 전달합니다. Enumerable.OrderBy 를 사용하면 원하는 비교자를 지정할 수 있습니다.

이를 수행하는 한 가지 방법입니다.

void Main()
{
    string[] things = new string[] { "paul", "bob", "lauren", "007", "90", "101"};

    foreach (var thing in things.OrderBy(x => x, new SemiNumericComparer()))
    {    
        Console.WriteLine(thing);
    }
}


public class SemiNumericComparer: IComparer<string>
{
    /// <summary>
    /// Method to determine if a string is a number
    /// </summary>
    /// <param name="value">String to test</param>
    /// <returns>True if numeric</returns>
    public static bool IsNumeric(string value)
    {
        return int.TryParse(value, out _);
    }

    /// <inheritdoc />
    public int Compare(string s1, string s2)
    {
        const int S1GreaterThanS2 = 1;
        const int S2GreaterThanS1 = -1;

        var IsNumeric1 = IsNumeric(s1);
        var IsNumeric2 = IsNumeric(s2);

        if (IsNumeric1 && IsNumeric2)
        {
            var i1 = Convert.ToInt32(s1);
            var i2 = Convert.ToInt32(s2);

            if (i1 > i2)
            {
                return S1GreaterThanS2;
            }

            if (i1 < i2)
            {
                return S2GreaterThanS1;
            }

            return 0;
        }

        if (IsNumeric1)
        {
            return S2GreaterThanS1;
        }

        if (IsNumeric2)
        {
            return S1GreaterThanS2;
        }

        return string.Compare(s1, s2, true, CultureInfo.InvariantCulture);
    }
}

1
주어진 입력에 대해 이것은 PadLeft ()와 관련된 Recursive의 대답과 동일한 결과를 생성합니다. 나는 당신의 입력이 실제로이 예제가 보여주는 것보다 더 복잡하다고 가정하고 있는데,이 경우 커스텀 비교자가 갈 길입니다.
Jeff Paulsen

건배. 이 솔루션은 작동하며 읽기 쉽고 깔끔한 구현 방법처럼 보입니다. +1 OrderBy에서 IComparer를 사용할 수 있음을 보여주기 위해 :)
sf.

17
IsNumeric방법은 코딩 구동되는 예외는 항상 나쁘다, 나쁘다. int.TryParse대신 사용하십시오 . 큰 목록으로 코드를 시도하면 영원히 걸릴 것입니다.
Nean Der Thal

도움이된다면 여기 에 단어 정렬 지원을 추가 하는이 버전에 확장 기능을 추가했습니다 . 내 요구를 들어, 공간의 분할은 충분했다, 나는 작은 혼합 사용하는 단어에 대한 걱정 (예 : test12 TEST3 대) 할 필요가 있었다
matt.bungard을

@NeanDerThal 디버깅 중이거나 Exception 개체에 액세스하는 경우 루프에서 많은 예외를 처리하는 속도가 느리거나 나쁘다고 확신합니다.
Kelly Elton

90

같은 길이로 0으로 채 웁니다.

int maxlen = sizes.Max(x => x.Length);
var result = sizes.OrderBy(x => x.PadLeft(maxlen, '0'));

간단한 해결책에 대한 +1은 하찮은 일에 속 태우고은 (이미 좋은 편집에서 수행) 것
마리노 시미치

좋은 생각이지만 다음 문제는 "90"이 "090"이 아닌 "90"이되어야하므로이 값을 표시해야한다는 것입니다
sf.

6
@sf : 시도해보세요. 결과가 마음에들 수도 있습니다. 주문 키는 주문되는 것이 아닙니다. 성을 기준으로 고객 목록을 주문하면 성 목록이 아닌 고객 목록이 표시됩니다. 변환 된 문자열로 문자열 목록을 정렬한다고 말하면 결과는 변환 된 문자열이 아니라 원래 문자열의 정렬 된 목록입니다.
Eric Lippert

이 작업을 수행하려면 "sizes = sizes.OrderBy (...)"를 추가해야했습니다. 그게 정상인가요 아니면 수정해야할까요?
gorgabal

1
@gorgabal : sizes결과가 다른 유형이기 때문에 일반적으로에 다시 할당 해도 작동하지 않습니다. 대답은 두 번째 줄이 결과를 표현으로 보여주기 때문에 짧게 표현할 수 있습니다.하지만 그것을 가지고 무언가를하는 것은 독자에게 달려 있습니다. 더 명확하게하기 위해 또 다른 변수 할당을 추가했습니다.
재귀

74

그리고 이것은 어떻습니까 ...

string[] sizes = new string[] { "105", "101", "102", "103", "90" };

var size = from x in sizes
           orderby x.Length, x
           select x;

foreach (var p in size)
{
    Console.WriteLine(p);
}

헤헤, 저는 이거 정말 좋아해요-아주 영리 해요. 초기 데이터의 전체 세트를 제공하지 않은 경우 죄송합니다
sf.

3
이것은 훨씬 더 나은 IMO 위의 패드 옵션과 같습니다.
dudeNumber4

3
var size = sizes.OrderBy (x => x.Length) .ThenBy (x => x);
Phillip Davis

1
그러나 이것은 다음과 같이 알파벳 문자열을 혼합 "b", "ab", "101", "103", "bob", "abcd"합니다.
Andrew

67

값은 문자열입니다.

List = List.OrderBy(c => c.Value.Length).ThenBy(c => c.Value).ToList();

공장


2
이 대답은 제가 가장 좋아하는 것입니다.
LacOniC

2
감사합니다. "ThenBy"메소드를 종료하는 것을 발견했습니다.
ganchito55

이것은 입력이 new 형식 인 사용 사례에 적합합니다string[] { "Object 1", "Object 9", "Object 14" }
thelem

2
이것이 최고의 답변입니다. 그것은 효과가 있고 좋은 학습입니다. 감사 !!
JulyOrdinary

1
그러나 이것은 다음과 같이 알파벳 문자열을 혼합 "b", "ab", "101", "103", "bob", "abcd"합니다.
Andrew

13

Windows StrCmpLogicalW에는 문자 대신 숫자로 문자열 숫자를 비교 하는 기본 함수가 있습니다 . 해당 함수를 호출하고 비교에 사용하는 비교자를 만드는 것은 쉽습니다.

public class StrCmpLogicalComparer : Comparer<string>
{
    [DllImport("Shlwapi.dll", CharSet = CharSet.Unicode)]
    private static extern int StrCmpLogicalW(string x, string y);

    public override int Compare(string x, string y)
    {
        return StrCmpLogicalW(x, y);
    }
}

텍스트와 숫자가 모두있는 문자열에서도 작동합니다. 여기에 기본 정렬과 사이의 디퍼 런스 세라마이드 표시하는 예제 프로그램입니다 StrCmpLogicalW종류

class Program
{
    static void Main()
    {
        List<string> items = new List<string>()
        {
            "Example1.txt", "Example2.txt", "Example3.txt", "Example4.txt", "Example5.txt", "Example6.txt", "Example7.txt", "Example8.txt", "Example9.txt", "Example10.txt",
            "Example11.txt", "Example12.txt", "Example13.txt", "Example14.txt", "Example15.txt", "Example16.txt", "Example17.txt", "Example18.txt", "Example19.txt", "Example20.txt"
        };

        items.Sort();

        foreach (var item in items)
        {
            Console.WriteLine(item);
        }

        Console.WriteLine();

        items.Sort(new StrCmpLogicalComparer());

        foreach (var item in items)
        {
            Console.WriteLine(item);
        }
        Console.ReadLine();
    }
}

어느 출력

Example1.txt
Example10.txt
Example11.txt
Example12.txt
Example13.txt
Example14.txt
Example15.txt
Example16.txt
Example17.txt
Example18.txt
Example19.txt
Example2.txt
Example20.txt
Example3.txt
Example4.txt
Example5.txt
Example6.txt
Example7.txt
Example8.txt
Example9.txt

Example1.txt
Example2.txt
Example3.txt
Example4.txt
Example5.txt
Example6.txt
Example7.txt
Example8.txt
Example9.txt
Example10.txt
Example11.txt
Example12.txt
Example13.txt
Example14.txt
Example15.txt
Example16.txt
Example17.txt
Example18.txt
Example19.txt
Example20.txt

나는 C #에서 시스템 라이브러리를 사용하는 것이 더 쉽습니다 좋겠어요
카일 딜레이 니

이것은 완벽했지만 불행히도 음수를 처리하지 않습니다. -1 0 10 2다음과 같이 정렬됩니다0 -1 2 10
nphx

5

이 시도

sizes.OrderBy(x => Convert.ToInt32(x)).ToList<string>();

참고 : 이것은 모든 문자열이 int .....로 변환 가능한 경우에 유용합니다.


1
이것은 문자열을 int로 변환합니다.
Femaref

1
"크기"도 숫자가 아닌 수 있습니다
김포.

"SQL에 LINQ"에 대한 잊지 않는 ToList()=> 전sizes.ToList().OrderBy(x => Convert.ToInt32(x))
A. 모렐

5

문자열에 숫자가 있으면 훨씬 더 좋을 것 같습니다. 도움이되기를 바랍니다.

추신 : 성능이나 복잡한 문자열 값에 대해서는 잘 모르겠지만 다음과 같이 잘 작동했습니다.

lorem ipsum
lorem ipsum 1
lorem ipsum 2
lorem ipsum 3
...
lorem ipsum 20
lorem ipsum 21

public class SemiNumericComparer : IComparer<string>
{
    public int Compare(string s1, string s2)
    {
        int s1r, s2r;
        var s1n = IsNumeric(s1, out s1r);
        var s2n = IsNumeric(s2, out s2r);

        if (s1n && s2n) return s1r - s2r;
        else if (s1n) return -1;
        else if (s2n) return 1;

        var num1 = Regex.Match(s1, @"\d+$");
        var num2 = Regex.Match(s2, @"\d+$");

        var onlyString1 = s1.Remove(num1.Index, num1.Length);
        var onlyString2 = s2.Remove(num2.Index, num2.Length);

        if (onlyString1 == onlyString2)
        {
            if (num1.Success && num2.Success) return Convert.ToInt32(num1.Value) - Convert.ToInt32(num2.Value);
            else if (num1.Success) return 1;
            else if (num2.Success) return -1;
        }

        return string.Compare(s1, s2, true);
    }

    public bool IsNumeric(string value, out int result)
    {
        return int.TryParse(value, out result);
    }
}

내가 찾던 바로 그것. 감사합니다!
klugerama

4

배열에 int로 변환 할 수없는 요소가 포함될 수 있기 때문에 숫자를 int로 변환 할 수 없다고 말하지만 시도해도 아무런 해가 없습니다.

string[] things = new string[] { "105", "101", "102", "103", "90", "paul", "bob", "lauren", "007", "90" };
Array.Sort(things, CompareThings);

foreach (var thing in things)
    Debug.WriteLine(thing);

그런 다음 다음과 같이 비교하십시오.

private static int CompareThings(string x, string y)
{
    int intX, intY;
    if (int.TryParse(x, out intX) && int.TryParse(y, out intY))
        return intX.CompareTo(intY);

    return x.CompareTo(y);
}

출력 : 007, 90, 90, 101, 102, 103, 105, bob, lauren, paul


Btw, 나는 단순성을 위해 Array.Sort를 사용했지만 IComparer에서 동일한 논리를 사용하고 OrderBy를 사용할 수 있습니다.
Ulf Kristiansen

이 솔루션은 IComparer (내 의견)를 사용하는 것보다 더 빠릅니다. 15000 개의 결과가 나오고 이것이 약 두 번째 차이를 산출한다고 생각합니다.
Jason Foglia

3

이것은 이상한 요청으로 보이며 이상한 해결책이 필요합니다.

string[] sizes = new string[] { "105", "101", "102", "103", "90" };

foreach (var size in sizes.OrderBy(x => {
    double sum = 0;
    int position = 0;
    foreach (char c in x.ToCharArray().Reverse()) {
        sum += (c - 48) * (int)(Math.Pow(10,position));
        position++;
    }
    return sum;
}))

{
    Console.WriteLine(size);
}

물론 0x30을 의미했습니다. 또한 배열에는 여전히 숫자가 아닌 문자열이 포함될 수 있으므로 솔루션이 흥미로운 결과를 생성합니다.
Femaref 2011-06-18

이 ... 당신을 귀찮게한다면 노트 -48 여부를 절대적으로 아무것도 변경되지 것을, 우리는 직접 그렇게 -48 것을 제거, 숯불의 정수 값을 사용할 수 있습니다
마리노 시미치를

char 값은 0x30입니다. int로 변환하면 숫자 0이 아닌 0x30이됩니다.
Femaref

정수로 변환하는 유일한 것은 Math.Pow에서 반환 된 그 두 배
마리노 시미치

femaref 그것이 0이든 아니든 상관 없습니다. 십진법 시스템이 그것을 처리합니다. 원한다면 Đ가 될 수 있습니다. 문자 세트에서 숫자가 오름차순이고 그보다 적다는 것이 중요합니다. 10보다
Marino Šimić

3

이 사이트에서는 영숫자 정렬에 대해 설명하고 ASCII 의미가 아닌 논리적 의미로 숫자를 정렬합니다. 또한 주변의 알파도 고려합니다.

http://www.dotnetperls.com/alphanumeric-sorting

예:

  • C : /TestB/333.jpg
  • 11
  • C : /TestB/33.jpg
  • 1
  • C : /TestA/111.jpg
  • 111F
  • C : /TestA/11.jpg
  • 2
  • C : /TestA/1.jpg
  • 111D
  • 22
  • 111Z
  • C : /TestB/03.jpg

  • 1
  • 2
  • 11
  • 22
  • 111D
  • 111F
  • 111Z
  • C : /TestA/1.jpg
  • C : /TestA/11.jpg
  • C : /TestA/111.jpg
  • C : /TestB/03.jpg
  • C : /TestB/33.jpg
  • C : /TestB/333.jpg

코드는 다음과 같습니다.

class Program
{
    static void Main(string[] args)
    {
        var arr = new string[]
        {
           "C:/TestB/333.jpg",
           "11",
           "C:/TestB/33.jpg",
           "1",
           "C:/TestA/111.jpg",
           "111F",
           "C:/TestA/11.jpg",
           "2",
           "C:/TestA/1.jpg",
           "111D",
           "22",
           "111Z",
           "C:/TestB/03.jpg"
        };
        Array.Sort(arr, new AlphaNumericComparer());
        foreach(var e in arr) {
            Console.WriteLine(e);
        }
    }
}

public class AlphaNumericComparer : IComparer
{
    public int Compare(object x, object y)
    {
        string s1 = x as string;
        if (s1 == null)
        {
            return 0;
        }
        string s2 = y as string;
        if (s2 == null)
        {
            return 0;
        }

        int len1 = s1.Length;
        int len2 = s2.Length;
        int marker1 = 0;
        int marker2 = 0;

        // Walk through two the strings with two markers.
        while (marker1 < len1 && marker2 < len2)
        {
            char ch1 = s1[marker1];
            char ch2 = s2[marker2];

            // Some buffers we can build up characters in for each chunk.
            char[] space1 = new char[len1];
            int loc1 = 0;
            char[] space2 = new char[len2];
            int loc2 = 0;

            // Walk through all following characters that are digits or
            // characters in BOTH strings starting at the appropriate marker.
            // Collect char arrays.
            do
            {
                space1[loc1++] = ch1;
                marker1++;

                if (marker1 < len1)
                {
                    ch1 = s1[marker1];
                }
                else
                {
                    break;
                }
            } while (char.IsDigit(ch1) == char.IsDigit(space1[0]));

            do
            {
                space2[loc2++] = ch2;
                marker2++;

                if (marker2 < len2)
                {
                    ch2 = s2[marker2];
                }
                else
                {
                    break;
                }
            } while (char.IsDigit(ch2) == char.IsDigit(space2[0]));

            // If we have collected numbers, compare them numerically.
            // Otherwise, if we have strings, compare them alphabetically.
            string str1 = new string(space1);
            string str2 = new string(space2);

            int result;

            if (char.IsDigit(space1[0]) && char.IsDigit(space2[0]))
            {
                int thisNumericChunk = int.Parse(str1);
                int thatNumericChunk = int.Parse(str2);
                result = thisNumericChunk.CompareTo(thatNumericChunk);
            }
            else
            {
                result = str1.CompareTo(str2);
            }

            if (result != 0)
            {
                return result;
            }
        }
        return len1 - len2;
    }
}

2

Jeff Paulsen이 제공 한 대답은 정확하지만 다음과 Comprarer같이 훨씬 단순화 할 수 있습니다.

public class SemiNumericComparer: IComparer<string>
{
    public int Compare(string s1, string s2)
    {
        if (IsNumeric(s1) && IsNumeric(s2))
          return Convert.ToInt32(s1) - Convert.ToInt32(s2)

        if (IsNumeric(s1) && !IsNumeric(s2))
            return -1;

        if (!IsNumeric(s1) && IsNumeric(s2))
            return 1;

        return string.Compare(s1, s2, true);
    }

    public static bool IsNumeric(object value)
    {
        int result;
        return Int32.TryParse(value, out result);
    }
}

결과를 확인하는 유일한 것은 Comparer결과가 더 크거나 작거나 0인지 여부입니다. 하나는 단순히 다른 값에서 값을 뺄 수 있으며 반환 값을 처리 할 필요가 없습니다.

또한이 IsNumeric메서드는 try-block 을 사용할 필요가 없으며 TryParse.

그리고 확실하지 않은 사람들을 위해 :이 비교기는 숫자가 아닌 값이 항상 목록 끝에 추가되도록 값을 정렬합니다. 처음에 원하는 경우 두 번째와 세 번째 if블록을 교체해야합니다.


TryParse 메서드를 호출하면 오버 헤드가있을 수 있으므로 s1 및 s2에 대한 isNumeric 값을 먼저 부울 값에 저장하고 대신 비교를 수행합니다. 이렇게하면 여러 번 평가되지 않습니다.
Optavius

1

이 시도 :

string[] things= new string[] { "105", "101", "102", "103", "90" };

int tmpNumber;

foreach (var thing in (things.Where(xx => int.TryParse(xx, out tmpNumber)).OrderBy(xx =>     int.Parse(xx))).Concat(things.Where(xx => !int.TryParse(xx, out tmpNumber)).OrderBy(xx => xx)))
{
    Console.WriteLine(thing);
}

1
public class NaturalSort: IComparer<string>
{
          [DllImport("shlwapi.dll", CharSet = CharSet.Unicode)]
          public static extern int StrCmpLogicalW(string x, string y);

          public int Compare(string x, string y)
          {
                 return StrCmpLogicalW(x, y);
          }
}

arr = arr.OrderBy (x => x, new NaturalSort ()). ToArray ();

내가 필요한 이유는 파일 이름이 숫자로 시작되는 디렉토리에 보관하기 위해서입니다.

public static FileInfo[] GetFiles(string path)
{
  return new DirectoryInfo(path).GetFiles()
                                .OrderBy(x => x.Name, new NaturalSort())
                                .ToArray();
}

0
Try this out..  



  string[] things = new string[] { "paul", "bob", "lauren", "007", "90", "-10" };

        List<int> num = new List<int>();
        List<string> str = new List<string>();
        for (int i = 0; i < things.Count(); i++)
        {

            int result;
            if (int.TryParse(things[i], out result))
            {
                num.Add(result);
            }
            else
            {
                str.Add(things[i]);
            }


        }

이제 목록을 정렬하고 다시 병합하십시오 ...

        var strsort = from s in str
                      orderby s.Length
                      select s;

        var numsort = from n in num
                     orderby n
                     select n;

        for (int i = 0; i < things.Count(); i++)
        {

         if(i < numsort.Count())
             things[i] = numsort.ElementAt(i).ToString();
             else
             things[i] = strsort.ElementAt(i - numsort.Count());               
               }

나는이 흥미로운 질문에 기여하려고 노력했습니다 ...


0

내가 선호하는 솔루션 (모든 문자열이 숫자 전용 인 경우) :

// Order by numerical order: (Assertion: all things are numeric strings only) 
foreach (var thing in things.OrderBy(int.Parse))
{
    Console.Writeline(thing);
}

0
public class Test
{
    public void TestMethod()
    {
        List<string> buyersList = new List<string>() { "5", "10", "1", "str", "3", "string" };
        List<string> soretedBuyersList = null;

        soretedBuyersList = new List<string>(SortedList(buyersList));
    }

    public List<string> SortedList(List<string> unsoredList)
    {
        return unsoredList.OrderBy(o => o, new SortNumericComparer()).ToList();
    }
}

   public class SortNumericComparer : IComparer<string>
{
    public int Compare(string x, string y)
    {
        int xInt = 0;
        int yInt = 0;
        int result = -1;

        if (!int.TryParse(x, out xInt))
        {
            result = 1;
        }

        if(int.TryParse(y, out yInt))
        {
            if(result == -1)
            {
                result = xInt - yInt;
            }
        }
        else if(result == 1)
        {
             result = string.Compare(x, y, true);
        }

        return result;
    }
}

코드 를 설명해 주 시겠습니까? 코드 전용 답변은 삭제 될 수 있습니다.
Wai Ha Lee

Jeff Paulsen 게시물은 IComparer <string>을 구현하여 문제를 해결하는 데 도움이되었습니다. .
kumar

0

Jeff Paulsen 답변을 확장합니다. 문자열에 몇 개의 숫자 또는 문자 그룹이 있는지는 중요하지 않은지 확인하고 싶었습니다.

public class SemiNumericComparer : IComparer<string>
{
    public int Compare(string s1, string s2)
    {
        if (int.TryParse(s1, out var i1) && int.TryParse(s2, out var i2))
        {
            if (i1 > i2)
            {
                return 1;
            }

            if (i1 < i2)
            {
                return -1;
            }

            if (i1 == i2)
            {
                return 0;
            }
        }

        var text1 = SplitCharsAndNums(s1);
        var text2 = SplitCharsAndNums(s2);

        if (text1.Length > 1 && text2.Length > 1)
        {

            for (var i = 0; i < Math.Max(text1.Length, text2.Length); i++)
            {

                if (text1[i] != null && text2[i] != null)
                {
                    var pos = Compare(text1[i], text2[i]);
                    if (pos != 0)
                    {
                        return pos;
                    }
                }
                else
                {
                    //text1[i] is null there for the string is shorter and comes before a longer string.
                    if (text1[i] == null)
                    {
                        return -1;
                    }
                    if (text2[i] == null)
                    {
                        return 1;
                    }
                }
            }
        }

        return string.Compare(s1, s2, true);
    }

    private string[] SplitCharsAndNums(string text)
    {
        var sb = new StringBuilder();
        for (var i = 0; i < text.Length - 1; i++)
        {
            if ((!char.IsDigit(text[i]) && char.IsDigit(text[i + 1])) ||
                (char.IsDigit(text[i]) && !char.IsDigit(text[i + 1])))
            {
                sb.Append(text[i]);
                sb.Append(" ");
            }
            else
            {
                sb.Append(text[i]);
            }
        }

        sb.Append(text[text.Length - 1]);

        return sb.ToString().Split(' ');
    }
}

또한 파일 이름을 처리하도록 수정 한 후 SO 페이지 에서 SplitCharsAndNums를 가져 왔습니다 .


-1

이것은 오래된 질문이지만 해결책을 제시하고 싶습니다.

string[] things= new string[] { "105", "101", "102", "103", "90" };

foreach (var thing in things.OrderBy(x => Int32.Parse(x) )
{
    Console.WriteLine(thing);
}

Woha 아주 간단 하죠? :디


-1
namespace X
{
    public class Utils
    {
        public class StrCmpLogicalComparer : IComparer<Projects.Sample>
        {
            [DllImport("Shlwapi.dll", CharSet = CharSet.Unicode)]
            private static extern int StrCmpLogicalW(string x, string y);


            public int Compare(Projects.Sample x, Projects.Sample y)
            {
                string[] ls1 = x.sample_name.Split("_");
                string[] ls2 = y.sample_name.Split("_");
                string s1 = ls1[0];
                string s2 = ls2[0];
                return StrCmpLogicalW(s1, s2);
            }
        }

    }
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.