web-dev-qa-db-ja.com

Linq特定の番号で最初に並べ替え、次に残りのすべてを順番に表示します

数字のリストがある場合:

1,2,3,4,5,6,7,8

特定の番号で注文してから残りを表示したいです。たとえば、「3」を選択した場合、リストは次のようになります。

3,1,2,4,5,6,7,8

Linqとc#を探しています。ありがとうございました

67
vts

OrderByまたはThenByで比較を使用して、条件付きソートを実行できます。

list.OrderByDescending(i => i == 3).ThenBy(i => i);

最初に一致結果が必要なため、OrderByDescendingを使用します(truefalseよりも「高い」)。

145
Tim Schmelter

たぶんこのようなもの:

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));
5
Arion

いくつかの回答は、最後の数を既に並べ替えています(既に並べ替えられたリストのみを表示しているため、正しいかもしれません)。 「選択されていない」番号を元の、必ずしもソートされた順序ではなく、ソートされた順序で表示する場合は、代わりに行うことができます。

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

@DuaneTheriotが指摘しているように、 IEnumerableの拡張メソッドOrderBy は安定したソートを行い、等しいキーを持つ要素の順序を変更しません。言い換えると;

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

同様に機能して、最初に3をソートし、他のすべての要素の順序を維持します。

3
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);
2
Adrian Iftode