2013-04-29 19 views
11

Desidero ordinare un elenco di stringhe, ma una stringa nell'elenco deve essere sempre all'inizio e non in ordine. Qual è il modo più semplice per farlo con LINQ?Elenco di ordinamento ad eccezione di una voce con LINQ

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

Non c'è un metodo di antefatto o qualcosa in LINQ, c'è?

risposta

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

Il trucco è quello di ordinare dal fatto che l'oggetto in questione è il vostro oggetto speciale, poi fine per il vostro articolo come si farebbe normalmente.

Poiché hai detto di voler ordinare un elenco (con linq) non dimenticare di assegnare il risultato della query alla lista.


È inoltre chiesto di un metodo prepend, come su questo:

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

si potrebbe facilmente rendere un metodo di estensione:

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

chiamato come:

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

'i = "primo"' farmi sorridere ':)' –

+0

che è secchione umorismo;) – daniel

+0

come su! , se abbiamo 2 o più voci da esentare? – WantIt

4

È possibile utilizzare OrderBy, ThenBy modello:

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

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

Ordina per due criteri. Il primo criterio si basa su una sorta di predicati, la seconda sul valore degli oggetti:

[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); 
    } 
} 
Problemi correlati