2016-04-10 7 views
0

erster Min() sind nicht die gleichen
Last und Max() sind nicht die gleichenSortedSet ersten und Min() sind nicht die gleichen

Im foreach die Sortierung
aaa
bbb
ccc
^^

Min()
^^

Max()
cc

Wie kann ich Min() bekommen und zuerst dasselbe sein?
Wie kann ich Max() und zuletzt die gleiche sein?

ss.FirstOrDefault() nicht gleich ss.Min()
ss.Reverse() FirstOrDefault() nicht gleich ss.Max()

public void SS() 
{ 
    SortedSet<string> ss = new SortedSet<string>(StringComparer.OrdinalIgnoreCase); 
    ss.Add("bbb"); 
    ss.Add("aaa");    
    ss.Add("^^"); 
    ss.Add("ccc"); 
    foreach (string s in ss) 
     Debug.WriteLine(s); 
    Debug.WriteLine(ss.Min()); 
    Debug.WriteLine(ss.Max());     
} 

Antwort

3

Verwenden Sie s.Min und ss.Max Eigenschaften (keine Methoden).

+0

Mit der Instanzeigenschaft 'ss.Min' wird das minimale Element in Bezug auf die Struktur von 'SortedSet ' gefunden und damit der Vergleich berücksichtigt, der von dieser Gruppe übernommen wird. Die 'ss.Min()' LINQ-Erweiterungsmethode vergisst jedoch alles über die sortierte Struktur und findet einfach das minimale Element in Bezug auf den Standard-Vergleicher (das ist 'Comparer .Default'), der genau wie' StringComparer.CurrentCulture funktioniert '. Mit "Ordinal-Ignorier-Fall" wird ein "a" (U + 0061) wie ein "A" behandelt (U + 0041), das _los_ ist als "^" (U + 005E). In deiner Kultur sind Buchstaben _greater_ als '^'. –

0

Die kurze Antwort lautet:. Sie können t.

Die längere Antwort ist in der Min-Implementierung, here.

Wenn Sie keine Zahlen vergleichen, verwendet der Code die Comparer<TSource>.Default, von der nicht garantiert wird, dass sie die ist, die Sie in der verwenden (und in Ihrem Fall nicht).

BTW, wenn Sie möchten, dass Min und First identisch sind, geben Sie beim Erstellen des Sets keinen Vergleich an. Es wird den Standard automatisch verwenden.

+0

Aber ich will diesen Vergleich. Min- und Max-Eigenschaften (keine Methode) scheinen zu funktionieren. – Paparazzi