Bir dize sayısal olduğunda değeri hesaplarken dizeleri alfabetik olarak nasıl sıralayabilirim?


101

Dizelerden oluşan bir sayı dizisini sıralamaya çalışıyorum ve bunların sayısal olarak sıralanmasını istiyorum.

İşin püf noktası , sayıları int'e çeviremem .

İşte kod:

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

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

çıktı: 101, 102, 103, 105, 90

Şunu isterim: 90, 101, 102, 103, 105

DÜZENLEME: Çıktı 090, 101, 102 ... olamaz

Kod örneği, "boyutlar" yerine "şeyler" diyecek şekilde güncellendi. Dizi şunun gibi bir şey olabilir:

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

Bu, alfabetik olarak ve numaraya göre sıralanması gerektiği anlamına gelir:

007, 90, bob, lauren, paul


8
Neden onları int'e çeviremiyorsun?
Femaref

1
"boyutlar", "ad" gibi başka bir şey olabilir. Kod örneği sadece basitleştirilmiştir.
sf.

2
Sayılardan herhangi biri negatif olacak mı? Hepsi tam sayı mı olacak? Tam sayıların aralığı nedir?
Eric Lippert

"şeyler" herhangi bir türden dizge olabilir. Listenin bilgisayar okuryazarı olmayan bir kişiye mantıksal olarak sıralanmasını istiyorum. Negatif sayılar postive'den önce olmalıdır. Dize uzunluğu açısından 100 karakterden fazla olmayacak.
sf.

5
Ne kadar uzağa gitmek istersin? Sonra image10gelmeli image2mi? Daha Januaryönce gelmeli Februarymi?
svick

Yanıtlar:


104

OrderBy'ye özel bir karşılaştırıcı geçirin. Enumerable.OrderBy , istediğiniz herhangi bir karşılaştırıcıyı belirlemenize izin verir.

Bunu yapmanın bir yolu şudur:

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
Verilen girdi için bu, PadLeft () 'i içeren Özyinelemeli'nin cevabıyla aynı sonucu verir. Girişinizin aslında bu örnekte gösterdiğinden daha karmaşık olduğunu varsayıyorum, bu durumda özel bir karşılaştırıcı gitmenin yoludur.
Jeff Paulsen

Şerefe. Bu çözüm işe yarıyor ve uygulanması için okunması ve temizlenmesi kolay bir yol gibi görünüyor. IComparer'ı OrderBy'de kullanabileceğinizi gösteren +1 :)
sf.

17
IsNumericYöntem kodlama sürülen bir durum her zaman kötü, kötü. int.TryParseBunun yerine kullanın . Kodunuzu geniş bir liste ile deneyin ve sonsuza kadar sürecektir.
Nean Der Thal

Yararlıysa, bu sürüme burada sözcüklerle sıralama desteği ekleyen bir uzantı ekledim . İhtiyaçlarım için, boşluklara bölmek yeterliydi ve karma kullanımlı kelimeler hakkında endişelenmeye çok az ihtiyacım vardı (örn. Test12 vs test3),
matt.bungard

@NeanDerThal Hata ayıklıyorsanız veya Exception nesnesine erişiyorsanız, bir döngüde çok sayıda istisnayı işlemenin yalnızca yavaş / kötü olduğundan eminim.
Kelly Elton

90

Sadece aynı uzunlukta sıfırlarla doldurun:

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

Basit bir çözüm 1, kusur arama (zaten güzel düzenleme yapılır) olur
Marino Šimić

Güzel fikir, ancak bir sonraki yakalama bu değerleri göstermem gerektiğidir, böylece "90", "090" değil, "90" olmalıdır
sf.

6
@sf: Deneyin, sonucu beğenebilirsiniz. Unutmayın, sipariş anahtarı sipariş edilen şey değildir. Soyadına göre müşteri listesi sipariş et desem, o zaman bir müşteri listesi alırım, soyadı listesi değil. Bir dizge listesini dönüştürülmüş bir dizgeye göre sıralamayı söylerseniz, sonuç, dönüştürülmüş dizelerin değil, orijinal dizelerin sıralı listesidir.
Eric Lippert

Bunun çalışması için "boyutlar = boyutlar.OrderBy (...)" eklemem gerekiyordu. Bu normal mi yoksa cevap düzenlenmeli mi?
gorgabal

1
@gorgabal: Genelde yeniden atamak sizesda işe yaramaz çünkü sonuç farklı bir tür. Cevap biraz kısa, çünkü ikinci satır sonucu bir ifade olarak gösteriyor, ancak onunla bir şeyler yapmak okuyucunun elinde. Bunu daha net hale getirmek için başka bir değişken ataması ekledim.
yinelemeli

74

Peki buna ne dersin ...

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

hehe, bunu gerçekten beğendim - çok zekice. İlk veri setinin tamamını sağlamadıysam özür dilerim
sf.

3
Bu tıpkı çok daha iyi IMO'nun üzerindeki ped seçeneği gibidir.
dudeNumber4

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

1
Ama bu böyle alfabetik dizeleri karışacaktır: "b", "ab", "101", "103", "bob", "abcd".
Andrew

68

Değer bir dizedir

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

İşler


3
Bu cevap benim favorim.
LacOniC

2
Teşekkürler, bunun bir "ThenBy" yönteminden çıktığını keşfettim.
ganchito55

Bu, girişin yeni formatta olduğu kullanım durumum için harika çalışıyorstring[] { "Object 1", "Object 9", "Object 14" }
2016

2
Bu en iyi cevap. İşe yarıyor ve iyi öğreniyor. Teşekkürler !!
JulyOrdinary

1
Ama bu böyle alfabetik dizeleri karışacaktır: "b", "ab", "101", "103", "bob", "abcd".
Andrew

13

Pencerelerde StrCmpLogicalW, dizge sayılarını harf yerine sayı olarak karşılaştıran yerel bir işlev vardır . Bu işlevi çağıran ve karşılaştırmaları için kullanan bir karşılaştırıcı yapmak kolaydır.

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

Hem metin hem de sayı içeren dizelerde bile çalışır. Burada varsayılan sıralama arasında diffrence gösterecek bir örnek programdır StrCmpLogicalWtür

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

hangi çıktılar

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


Bu mükemmel olurdu, ancak maalesef negatif sayıları işlemiyor. -1 0 10 2şu şekilde sıralanıyor0 -1 2 10
nphx

5

bunu dene

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

Not: Bu, tümü int türüne dönüştürülebilir olduğunda yardımcı olacaktır .....


1
bu tür dizeyi int türüne dönüştürür.
Femaref

1
"boyutlar" ayrıca sayısal olmayabilir
sf.

"LINQ to SQL" için ToList()sizes.ToList().OrderBy(x => Convert.ToInt32(x))
A. Morel

5

Sanırım dizede bir miktar sayısal varsa bu çok daha iyi olacak. Umarım yardımcı olur.

Not: Performans veya karmaşık dizge değerlerinden emin değilim, ancak şöyle iyi çalıştı:

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

Tam olarak aradığım şey. Teşekkür ederim!
klugerama

4

Sayıları int'e dönüştüremeyeceğinizi söylüyorsunuz çünkü dizi int'e dönüştürülemeyen öğeler içerebilir, ancak denemenin bir zararı yoktur:

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

Sonra şöyle karşılaştırın:

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

Çıktı: 007, 90, 90, 101, 102, 103, 105, bob, lauren, paul


Btw, basitlik için Array.Sort kullandım, ancak aynı mantığı bir IComparer'da kullanabilir ve OrderBy'yi kullanabilirsiniz.
Ulf Kristiansen

Bu çözüm, IComparer kullanmaktan daha hızlı görünüyor (bence). 15000 sonuç ve bunun yaklaşık ikinci bir fark getirdiğini hissediyorum.
Jason Foglia

3

Bu garip bir istek gibi görünüyor ve garip bir çözümü hak ediyor:

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

Tabii ki 0x30 demek istedim. Ayrıca dizi, çözümün ilginç sonuçlar üreteceği sayısal olmayan bir dizge de içerebilir.
Femaref

Ve -48'in kesinlikle hiçbir şeyi değiştirmeyeceğini unutmayın, char'ın tamsayı değerini doğrudan kullanabiliriz, bu yüzden sizi rahatsız ediyorsa -48'i kaldırın ...
Marino Šimić

Char değeri
0x30'dur

Tamsayıya dönüştürülen tek şey Math.Pow
Marino Šimić'den 18'11

femaref sıfır olup olmadığı önemli değil, dekadik sistem bununla ilgileniyor, isterseniz bir Đ olabilir, önemli olan tek şey sayıların karakter setinde artan sıralarda olması ve daha az olması 10'dan
Marino Šimić

3

Bu site alfanümerik sıralamayı tartışır ve sayıları ASCII mantığı yerine mantıksal anlamda sıralayacaktır. Ayrıca etrafındaki alfaları da hesaba katar:

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

MİSAL:

  • 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

Kod aşağıdaki gibidir:

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 tarafından verilen cevap doğrudur, ancak şuna Comprarergöre çok daha basitleştirilebilir:

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

Bu işe Compareryarar çünkü sonucun kontrol edildiği tek şey sonucun daha büyük, küçük veya sıfıra eşit olmasıdır. Biri, değerleri diğerinden basitçe çıkarabilir ve dönüş değerlerini işlemek zorunda değildir.

Ayrıca IsNumericyöntemin try-blok kullanmaması gerekir ve bundan faydalanabilir TryParse.

Ve emin olmayanlar için: Bu Karşılaştırıcı, sayısal olmayan değerler her zaman listenin sonuna eklenecek şekilde değerleri sıralayacaktır. Bunları başlangıçta isteyen varsa, ikinci ve üçüncü ifblok değiştirilmelidir.


TryParse yöntemini çağırmanın muhtemelen bir miktar ek yükü olduğundan, s1 ve s2 için isNumeric değerlerini önce boole değerlerine kaydeder ve bunun yerine karşılaştırmayı yaparım. Bu şekilde birden çok kez değerlendirilmezler.
Optavius

1

Bunu dene :

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

Buna ihtiyacımın nedeni, dosya adları bir sayı ile başlayan bir dizinde dosyalanmaktı:

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


        }

Şimdi listeleri sıralayın ve tekrar birleştirin ...

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

Bu ilginç soruda bir katkı sağlamaya çalıştım ...


0

Tercih ettiğim çözüm (tüm dizeler yalnızca sayısal ise):

// 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;
    }
}

Eğer Can açıklamak kodunuzu? Yalnızca kod yanıtları silinmekle yükümlüdür.
Wai Ha Lee

Jeff Paulsen gönderisi, sınıflandırma sorunumu düzeltmek için IComparer <string> uygulamasını uygulamama yardımcı oldu. .
kumar

0

Jeff Paulsen cevabını genişletiyor. Dizelerde kaç sayı veya karakter grubu olduğunun önemli olmadığından emin olmak istedim:

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(' ');
    }
}

Ayrıca , dosya adlarıyla ilgilenmek için değiştirdikten sonra bir SO Sayfasından SplitCharsAndNums aldım .


-1

Bu eski bir soru olsa da bir çözüm vermek istiyorum:

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

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

Woha oldukça basit değil mi? : D


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

    }
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.