SORU
18 HAZİRAN 2011, CUMARTESİ


c string olan# orderby seri numaraları (ve onları int dönüştürmek)

Dizeleri, sayılar bir dizi sıralamak için çalışıyorum ve onları sayısal olarak sıralamak istiyorum.

AvYapamam int içine sayıları dönüştürür.

İşte kod:

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

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

çıkış: 101, , 103, 105, 90 102

İstiyorum: 90, , 102, 103, 105 101

EDİT: Çıkış 090, 101, 102... olamaz

Kod örneği söylemek güncellenen "şeyler" yerine "boyutları". Bu dizi böyle bir şey olabilir:

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

Bu alfabetik olarak ve numarasına göre sıralanmış olması gerekiyor

007, 90, bob, lauren, paul

CEVAP
18 HAZİRAN 2011, CUMARTESİ


OrderBy içine özel bir karşılaştırıcısı geçirir. Enumerable.OrderBy istediğin kadar karşılaştırıcısı belirtmenize izin verir.

Bu bunu yapmak için bir yoldur:

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>
{
    public int Compare(string s1, string s2)
    {
        if (IsNumeric(s1) && IsNumeric(s2))
        {
            if (Convert.ToInt32(s1) > Convert.ToInt32(s2)) return 1;
            if (Convert.ToInt32(s1) < Convert.ToInt32(s2)) return -1;
            if (Convert.ToInt32(s1) == Convert.ToInt32(s2)) return 0;
        }

        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)
    {
        try {
            int i = Convert.ToInt32(value.ToString());
            return true; 
        }
        catch (FormatException) {
            return false;
        }
    }
}

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • JTechTalk

    JTechTalk

    11 Temmuz 2010
  • khloe brooks

    khloe brooks

    25 Temmuz 2011
  • WePlayWeWatch

    WePlayWeWatc

    3 Temmuz 2013