2016-04-28 10 views
1

mit, dass mein Code ist ...bestellt Liste <object> lexikografisch Brute-Force-

string text = "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Suspendisse quis nisl vitae dolor tempus iaculis at id augue. Nullam metus mauris, viverra vitae tristique sed, pulvinar ac nulla." 

List<object> listCarac = new List<object>(); 
object aux = 0; 

text.Replace(" ", ""); 

for (int i = 0; i < text.Count(); i++) 
{ 
    listCarac.Add(text.Substring(i,1)); 
} 

for (int x = 0; x < listCarac.Count(); x++) 
{ 
    for (int y = x + 1; y < listCarac.Count(); y++) 
    { 
     if (listCarac[x] > listCarac[y]) // My problem is here 
     { 
      aux = listCarac[x]; 
      listCarac[x] = listCarac[y]; 
      listCarac[y] = aux; 
     } 
    } 
} 

Mein Problem ist, wie lexikographisch zu vergleichen, ich denke, wenn das ist alphabetisch zu vergleichen. Danke.

+1

Nun lassen Sie uns beginnen mit, was als „lexicographic“ Bestellung, wenn Ihre Liste tatsächlich enthalten ist (sagen wir) ein 'FileStream' und ein' Button' ... (Sie könnten 'mit' Liste beginnen soll. Beachten Sie auch, dass der Methodenaufruf 'text.Replace' nichts nützliches macht, da Sie den Rückgabewert ignorieren ...) –

+0

Sie müssen das Objekt als IComparable definieren oder zumindest IComparable überprüfen und an IComparable übergeben. Ziemlich viele C# Basistypen haben das, und es wird von fast allen Sortierern verwendet. – Nyerguds

+0

Dies sollte nicht einmal kompiliert werden, da es keinen '>' Operator für 'object' gibt. Es sieht so aus, als ob Sie die Zeichen in einer Zeichenfolge sortieren möchten. Die einfachste Lösung wäre, in diesem Fall 'text.OrderBy' zu verwenden. – Lee

Antwort

0

Ihre Liste enthält Instanzen des Typs object, der IComparable nicht implementiert und somit nicht instance1 < instance2 aufrufen kann. Da Sie jedoch nur einzelne Zeichen in Ihre Liste aufnehmen, können Sie statt einer Liste statt dessen einen List<char> statt string verwenden.

So können Sie jetzt diese nennen:

listCarac = listCarac.OrderBy(x => x).ToList(); 

Welches ist Ihr Zeichen lexikographisch bestellen wird.

Weiterhin wird beim Aufruf string.Replace das Ergebnis von der Methode zurückgegeben, da Strings unveränderlich sind. So verwenden Sie innerhalb der ersten Schleife den ursprünglichen Inhalt von text statt der ersetzten. Verwenden Sie stattdessen: text = text.Replace(" ", "");

EDIT: Wenn - wie Sie in Ihren Kommentaren behaupten - eine Liste von object zu verwenden und alle Instanzen innerhalb dieser Liste implementieren IComparable (die char tut) Sie einfach die Instanzen auf die werfen können Schnittstelle vor dem Sortieren:

var result = listCarac.OfType<IComparable>().OrderBy(x => x); 
+0

Ich kann eine Liste von Char nicht verwenden, ich muss dies mit einer generischen Liste tun. –

+0

Sorry, ich muss eine Liste von Objekten verwenden.Kann ich das Zeichen einfach in Unicode konvertieren und die Werte vergleichen? Wenn ja, wie kann ich diese Konvertierung machen? –

+0

Das funktioniert !! Danke vielmals!! –

0

wir wissen nicht viel über object aber wir über IComparable Artikel wissen.

Ich würde vorschlagen, dass Sie die Liste

var listCarac = new List<IComparable>(); 

Und als mit der Interface-Methode CompareTo

int CompareTo(
    object obj 
) 

Ändern Welche

if (listCarac[x] > listCarac[y]) 

Um

ändern
0

Ich denke, dass Sie die SORT-Methode für List nutzen können. Bei Bedarf können Sie einen Komparator bereitstellen, um bestimmte Fälle zu behandeln.

String text = "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Suspendisse quis nisl vitae dolor tempus iaculis at id augue. Nullam metus mauris, viverra vitae tristique sed, pulvinar ac nulla."; 
text = text.Replace(" ", ""); 
List<char> demo = text.ToCharArray().ToList(); 
demo.Sort(); 
string result = System.Text.Encoding.UTF8.GetString(demo.Select(c => (byte)c).ToArray());