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

  • John Lynn

    John Lynn

    8 Ocak 2010
  • MovieZoneET

    MovieZoneET

    22 Aralık 2009
  • NextKsa

    NextKsa

    7 EKİM 2009