2012-03-29 6 views

Odpowiedz

114
list.OrderByDescending(i => i == 3).ThenBy(i => i); 
+0

@Tim Schmelter, co jeśli chcę pokazać 3 w lat? – cracker

+4

@cracker: zmień 'OrderByDescending' na' OrderBy' lub 'i == 3' na' i! = 3' –

4

Może coś takiego:

List<int> ls=new List<int>{1,2,3,4,5,6,7,8}; 
int nbr=3; 
var result= ls.OrderBy (l =>(l==nbr?int.MinValue:l)); 
3

Kilka odpowiedzi już uporządkować kilka ostatnich numerów (które mogą być poprawne, ponieważ jesteś tylko wykazujące już posortowana lista). Jeśli chcesz, aby numery "niewybranych" były wyświetlane w ich oryginalnym, niekoniecznie posortowanym porządku, zamiast sortowania, możesz zamiast tego zrobić;

int num = 3; 
var result = list.Where(x => x == num).Concat(list.Where(x => x != num)); 

Jak @DuaneTheriot wskazuje IEnumerable's extension method OrderBy ma stabilną rodzaju i nie zmienić kolejność elementów, które mają równe klucz. Innymi słowy;

var result = list.OrderBy(x => x != 3); 

działa równie dobrze, aby najpierw sortować 3 i zachować kolejność wszystkich pozostałych elementów.

+0

Możesz zrobić to samo z 'list.OrderBy (i => i! = 3)'. –

2
public static IEnumerable<T> TakeAndOrder<T>(this IEnumerable<T> items, Func<T, bool> f) 
{  
    foreach (var item in items.Where(f)) 
     yield return item; 
    foreach (var item in items.Where(i=>!f(i)).OrderBy(i=>i)) 
     yield return item; 
} 


var items = new [] {1, 4, 2, 5, 3}; 
items.TakeAndOrder(i=> i == 4); 
Powiązane problemy