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
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.
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ç.
Hata ayıklama .Visual Studio 2012'de N...
&; Güvenli olmayan JavaScript URL ile ...
Basit çalıştırırken hata alıyorum java...
Youtube iframe apı hata " konsol ç...
JSON karşılaştırılması Objective-C (JS...