2013-01-09 4 views
15

J'ai un List<Person> et que vous voulez plutôt que de les convertir pour le traitement simple à un List<string>, procédez comme suit:Est-ce que LINQ to Objects garder son ordre

List<Person> persons = GetPersonsBySeatOrder(); 
List<string> seatNames = persons.Select(x => x.Name).ToList(); 

Console.WriteLine("First in line: {0}", seatNames[0]); 

L'énoncé .Select() sur LINQ pour objet objets garantis pour ne pas modifier l'ordre des membres de la liste? En supposant qu'aucun caractère/groupe/ordre explicite n'est ajouté

De même, si une clause arbitraire .Where() est utilisée en premier, est-il toujours garanti de conserver l'ordre relatif, ou utilise-t-il parfois un filtrage non itératif? Comme Fermin commenté ci-dessus, c'est essentiellement une question en double. J'échoué sur la sélection des mots-clés corrects pour rechercher StackOverflow

Preserving order with LINQ

+5

De bons détails de requêtes linq et de commande ici: http://stackoverflow.com/questions/204505/preserving-order-with-linq – Fermin

Répondre

3

En application .Net actuelle, il utilise un tel code. Mais il n'y a aucune garantie que cette implémentation sera à l'avenir.

private static IEnumerable<TResult> SelectIterator<TSource, TResult>(IEnumerable<TSource> source, Func<TSource, int, TResult> selector) 
{ 
    int index = -1; 
    foreach (TSource source1 in source) 
    { 
    checked { ++index; } 
    yield return selector(source1, index); 
    } 
} 
+2

Je doute que l'implémentation interne d'une telle méthode largement utilisée comme .Select() serait être modifié pour renvoyer des objets dans un ordre différent. – Fermin

+1

Les lignes de base de données n'ont aucune garantie. Les listes font. Cela doit absolument dépendre du type de collection sous-jacent (c'est-à-dire du * enumerator * du type de collection sous-jacent), et l'ordre de la liste doit être préservé, garanti. Select utiliserait l'énumérateur du type List, et actuellement il préserve l'ordre, garanti. – Triynko

2

Cela dépend plus du type de collection sous-jacent. Vous pourriez obtenir des commandes inconsistantes à partir d'un HashSet, mais une liste est sûre. Même si la commande que vous voulez est fournie implicitement, il est préférable de définir un ordre explicite si vous en avez besoin. Il semble que vous le fassiez à en juger par les noms des méthodes.

Questions connexes