2013-04-29 15 views
11

Chcę zamówić listę ciągów znaków, ale jeden ciąg na liście powinien zawsze znajdować się na początku i nie być posortowany. Jaki jest najłatwiejszy sposób na zrobienie tego za pomocą LINQ?Lista sortowania z wyjątkiem jednego wpisu z LINQ

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

W LINQ nie ma metody prependowej ani czegoś takiego, prawda?

Odpowiedz

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

Sztuką jest zamówienie, czy przedmiot jest przedmiotem specjalnym, a następnie zamówienie według pozycji, jak zwykle.

Ponieważ powiedziałeś, że chcesz zamówić listę (z linq), nie zapomnij o przypisaniu wyniku zapytania do listy.


też poproszony o sposobie poprzedzić, jak o tym:

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

można łatwo zrobić to metodę rozszerzenia:

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

nazwie jak:

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

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

+0

który jest frajerem humor;) – daniel

+0

jak o! , jeśli mamy 2 lub więcej wpisów do zwolnienia? – WantIt

4

Można użyć OrderBy, ThenBy wzór:

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

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

Zamów przez dwa kryteria. Pierwsze kryterium jest oparty na jakimś orzecznika, drugi na wartości elementów:

[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); 
    } 
} 
Powiązane problemy