2009-03-26 4 views
1

Je suis en train de trier une liste comme ceci:Classement des commandes - Méthode d'extension non-allumage!

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 
} 

Le problème est que la liste ne soit ordonnée et la méthode de la distance ne soit pas tiré pas (je mets un point d'arrêt là-dedans, mais qui ne fonctionne pas se faire frapper).

Toute aide appréciée!

Répondre

3

Ceci est dû Linq's Deferred Execution

Dans LINQ, l'exécution d'une requête est généralement différé jusqu'au moment où vous demandez les données.

Alors, pour voir votre travail de méthode, appliquer la méthode ToList() à votre IOrderedEnumerable afin que vous demanderez effectivement les données, et donc l'exécution a lieu.

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

Cette solution force l'exécution différée afin que la distance soit appelée mais myStrings ne sera toujours pas trié. – trampster

+0

Oui, c'est vrai; Je ne faisais que forcer l'exécution. J'ai mis à jour la réponse afin que la liste triée retournée soit stockée –

1

myStings = myStings.OrderBy (each => Distance (chacun, cible)). ToList();

+0

omg - pas encore le vieux truc de chaîne.réplace ... merci! – JohnIdol

+0

string.replace? –

+0

La chaîne String.Replace est due au fait que les chaînes sont immuables –

1

votre

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

commander votre liste initiale wont il renvoie une liste ordonnée. Vous avez besoin:

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

cela forcera l'exécution différée avoir lieu et vous donner le résultat dont vous avez besoin.

Questions connexes