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

  • bunliu

    bunliu

    2 Mayıs 2007
  • Gee Cee

    Gee Cee

    1 AĞUSTOS 2009
  • wwjoshdu

    wwjoshdu

    18 ŞUBAT 2011