SORU
6 Kasım 2012, Salı


Dizesinde hata karşılaştırılması .NET Çerçeve

comparison sort herhangi bir şart altında yatan sipariş operatörü transitive and antisymmetric Bu iş için.

.NET, bazı dizeleri için doğru değil:

static void CompareBug()
{
  string x = "\u002D\u30A2";  // or just "-ア" if charset allows
  string y = "\u3042";        // or just "あ" if charset allows

  Console.WriteLine(x.CompareTo(y));  // positive one
  Console.WriteLine(y.CompareTo(x));  // positive one
  Console.WriteLine(StringComparer.InvariantCulture.Compare(x, y));  // positive one
  Console.WriteLine(StringComparer.InvariantCulture.Compare(y, x));  // positive one

  var ja = StringComparer.Create(new CultureInfo("ja-JP", false), false);
  Console.WriteLine(ja.Compare(x, y));  // positive one
  Console.WriteLine(ja.Compare(y, x));  // positive one
}

x ** 5, y x kesinlikle daha büyük, daha sıkı, daha büyük olduğunu görürsünüz.

Tüm sıfır (0) x.CompareTo(x) çünkü bu bir emir değil açıktır. Şaşırtıcı olmayan bir şekilde, 10* İ *diziler x y gibi dizeleri içeren listeler öngörülemeyen sonuçlar alıyorum. İ yok ama test bu, eminim SortedDictionary<string, WhatEver> olacak sorunları tutmak kendi içinde sıralanmış ve/veya öğeleri bulmak eğer dizeleri gibi x y kullanılan tuşları.

Bu hata biliniyor?Etkilenen çerçeve ile çalışıyorum .ne NET 4.0)?

DÜZENLEME:

İşte işareti negatif ya da böyle olduğu bir örnek:

x = "\u4E00\u30A0";         // equiv: "一゠"
y = "\u4E00\u002D\u0041";   // equiv: "一-A"

CEVAP
6 Kasım 2012, Salı


Sıralama doğru ise senin sorunun çok önemli olduğunu, sadece sıra kullan kültür duyarlı yerine string comparison. Sadece bu tek geçişli ve anahtarı istediğiniz karşılaştırarak garanti eder.

What MSDN says:

Bu StringComparison belirtme.Ya da sıra StringComparison.Bir yöntem OrdinalİgnoreCase değer anlamına gelir bir ara dile ait olmayan hangi doğal özellikleri karşılaştırma diller yok sayılır. Bu çağrılan yöntemleri StringComparison temel string işlem basit bayt karşılaştırmalar kararlar değerleri kasa yerine veya parametreli tarafından eşdeğerlik tabloları kültür. Çoğu durumda, bu yaklaşım en iyi tasarlanmış uyuyor kod daha hızlı ve daha güvenilir yaparken dizeleri yorumu.

Ve beklendiği gibi çalışır:

    Console.WriteLine(String.Compare(x, y, StringComparison.Ordinal));  // -12309
    Console.WriteLine(String.Compare(y, x, StringComparison.Ordinal));  // 12309

Evet, kültür duyarlı karşılaştırma tutarsız sonuçlar verir açıklamıyor. Peki, bu tuhaf kültür — garip bir sonuç.

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • boogie2988

    boogie2988

    6 NİSAN 2006
  • Easy Learn Tutorial

    Easy Learn T

    10 Kasım 2012
  • Elly

    Elly

    3 EKİM 2005