2013-04-29 5 views
11

Je souhaite commander une liste de chaînes, mais une chaîne de la liste doit toujours être au début et non triée. Quelle est la manière la plus simple de le faire avec LINQ?Liste de tri à l'exception d'une entrée avec LINQ

//should be ordered in: first, a,b,u,z: 
List<string> l = {"z","u","first","b","a"}; 

Il n'y a pas de méthode de préfixe ou quelque chose dans LINQ, n'est-ce pas?

Répondre

19
l = l.OrderBy(i => i != "first").ThenBy(i => i).ToList(); 

L'astuce ici est de classer par ordre d'importance si l'article en question est votre article spécial, puis commandez par votre article comme vous le feriez normalement.

Puisque vous avez dit que vous voulez commander une liste (avec linq), n'oubliez pas d'assigner le résultat de la requête à la liste.


Vous avez également demandé une méthode préfix, que diriez-vous:

l = new[] { "first" }.Concat(l).ToList(); 

Vous pouvez facilement faire une méthode d'extension:

public static class LinqExtensions 
{ 
    public static IEnumerable<T> Prepend<T>(this IEnumerable<T> query, T item) 
    { 
     return new[] { item }.Concat(query); 
    } 
} 

appelé:

l = l.Prepend("first").ToList(); 
+1

'i = "first"' make me smile ':)' –

+0

qui est de l'humour nerd;) – daniel

+0

que diriez-vous! , si nous avons 2 entrées ou plus à exempter? – WantIt

4

Vous pouvez utiliser OrderBy, ThenBy motif:

string[] l = { "z", "u", "first", "b", "a" }; 

var result = l.OrderBy(i => i != "first").ThenBy(i => i); 
1

Trier par deux critères. Les premiers critères se fonde sur une sorte de prédicat, la seconde sur la valeur des éléments:

[TestMethod] 
public void TestMethod1() 
{ 
    var list = new[] { "z", "u", "first", "b", "a" }.OrderByPredicateFirst(s => s == "first").ToList(); 
    Assert.AreEqual("first", list[0]); 
    Assert.AreEqual("a", list[1]); 
    Assert.AreEqual("b", list[2]); 
    Assert.AreEqual("u", list[3]); 
    Assert.AreEqual("z", list[4]); 
} 

public static class Extensions 
{ 
    public static IEnumerable<T> OrderByPredicateFirst<T>(this IEnumerable<T> source, Predicate<T> firsts) 
    { 
     return source 
      .OrderBy(s => firsts(s) ? 0 : 1) 
      .ThenBy(s => s); 
    } 
}