2013-05-22 22 views
6

私はプロパティランクを持つオブジェクトのリストを持っています。これは整数です。どのように並べ替えることができますが、底にゼロを入れますか?

私は私の見解でランクによってソートしたいが、私はこれを行うとき:

myObjects = myObjects.Orderby(r=>r.Rank); 

を私は(これらが上に設定されていないという意味)ゼロの全てを取得

私が欲しいです1 - > nで注文するが、0をリストの一番下に置く。私はそれがリストできるだけ一種として効率的になりたい

はかなり長いです

答えて

18

LINQ:

myObjects = myObjects 
    .OrderBy(r => r.Rank == 0) //false before true 
    .ThenBy(r => r.Rank); 

このは実際には2つの完全な種類をしないます。 2つのラムダを組み合わせて、の2つのキーにまたがる辞書ソートを行います。

あなたはそれほど明白ではないfalse -before- trueルールに慣れていないなら、あなたはr => r.Rank == 0 ? 1 : 0との最初のラムダを置き換えることができます - しかし、false -before- trueルールは、これは本当に冗長思われてしまう知っています。

+0

2つの完全な種類を行う必要なく、より良い方法がありますか? – leora

+0

@leora:詳細はhttp://msmvps.com/blogs/jon_skeet/archive/2011/01/04/reimplementing-linq-to-objects-part-26a-iorderedenumerable.aspx(および後続の記事)を参照してください。 –

+2

@leora:これは2つの完全な種類はありません。 "OrderBy/ThenBy"はかなりスマートです。クエリ式の結果は、*クエリの結果の計算ではなく、*クエリ*であることを覚えておいてください。クエリが実行されると、クエリはOrderByの後にThenByがあるかどうかを知る。 –

6

カスタムコンペアラ(IComparerを実装)を作成し、ゼロから下にソートすることができます。その後

public class ZeroComparer : IComparer { 
    public int Compare(Object intA, Object intB) { 
     if(intA == 0 && intB != 0) 
      return -1; 
     if(intA != 0 && intB == 0) 
      return 1; 
     return int.Compare(intA, intB); 
    } 
} 

のようにそれを使用します:擬似コードは以下のようになり

var comparer = new ZeroComparer(); 
myObjects = myObjects.Orderby(r=>r.Rank, comparer); 

カスタムする比較器を使用する方法の簡単な例:に対処する

Use own IComparer<T> with Linq OrderBy

1
myObjects = myObjects.Orderby(r => r.Rank == 0 ? int.MaxValue : r.Rank); 

ケースRank == int.MaxValue

myObjects = myObjects.Orderby(r => r.Rank == 0 ? int.MaxValue : r.Rank - 1); 
+1

もし 'int。MaxValue'はRankの有効な値ですか? – svick

+1

良い発言ですから、order節をランク付けするために '1'を取る必要があります。種を編集した質問。 – polkduran

関連する問題