2009-03-26 20 views
1

Ich versuche, eine Liste wie diese zu sortieren:Listenbestellung - Erweiterungsmethode nicht ausgelöst!

public void Example() 
{ 
    string target = "hello"; 

    List<string> myStings = new List<string>(); 

    myStings.Add("babab"); 
    myStings.Add("Helll"); 
    myStings.Add("atest"); 

    myStings.OrderBy(each => Distance(each, target)); 
} 

public int Distance(string stringA, string stringB) 
{ 
    // Whatever 
} 

Das Problem ist, dass die Liste nicht bestellt bekommt und die Entfernung Methode nicht gefeuert bekommt (ich dort einen Haltepunkt setzen tut, aber nicht geschlagen werden).

Jede Hilfe wird geschätzt!

Antwort

3

Dies ist wegen der Linq's Deferred Execution

In LINQ, Ausführung einer Abfrage wird in der Regel bis zu dem Moment verschoben, wenn Sie tatsächlich die Daten anfordern.

So, Ihre Methode Arbeits sehen, wenden Sie die ToList() Methode auf Ihre IOrderedEnumerable so dass Sie die Daten tatsächlich, Anfordern und damit die Ausführung erfolgt.

myStings = myStings.OrderBy(each => Distance(each, target)).ToList(); 
+0

Diese Lösung erzwingt die verzögerte Ausführung, so dass die Entfernung aufgerufen wird, aber myStrings weiterhin nicht sortiert werden. – trampster

+0

Ja, das stimmt; Ich habe nur die Hinrichtung erzwungen. Ich habe die Antwort aktualisiert, so dass die zurückgegebene sortierte Liste gespeichert wird –

1

myStings = myStings.OrderBy (each => Abstand (jedes, Ziel)). ToList();

+0

omg - nicht wieder der alte string.replace trick ... danke! – JohnIdol

+0

string.replace? –

+0

Die String.Replace-Sache ist, da Strings unveränderlich sind –

1

Ihre

myStrings.OrderBy(each => Distance(each, target)); 

gewohnt bestellen sie Ihre ursprüngliche Liste eine geordnete Liste zurückzukehren. Sie benötigen:

myStrings = myStrings.OrderBy(each => Distance(each, target)).ToList(); 

dies die verzögerte Ausführung zu zwingen wird, und gibt Ihnen das Ergebnis, das Sie benötigen.