2009-07-15 8 views
0

私は文字列のセットを持っています。別の文字列を含むすべての文字列を選択したい。しかし、私は最初のアイテム、検索で始まるアイテム、そしてアルファベット順に他のアイテムを持っていたいと思います。しかし、次のコードは機能しません:C#で2つの注文基準を使用するには?

items = items 
    .Where(a => a.Contains(contained)) 
    .OrderBy(a => a) 
    ; 
var startsWith = items.Where(a => a.StartsWith(contained)); 
items = startsWith.Union(items.Except(startsWith)); 

私は何をしなければなりませんか?

items = items.OrderBy(x => !x.Contains(contained)) 
      .ThenBy(x => x); 

なおfalse種類の前にtrue故に:

+1

「次のコードは機能しません」と言うと、実際に何が起こっているのですか? –

+0

@Michaelそれはアルファベット順にソートされています –

答えて

5

は、startsWith.Concat

5

としてだけでなく、マイケルのオプションを使用して、あなた可能性もブールによって順序をstartsWith.Unionを交換してください!ここに - あなたはまた、それをより明確にするために、条件を使用することができます。

items = items.OrderBy(x => x.Contains(contained) ? 0 : 1) 
      .ThenBy(x => x); 

テストプログラム:

using System; 
using System.Linq; 

public class Test 
{ 
    static void Main() 
    { 
     var items = new string[] { "the", "quick", "brown", "fox", 
       "jumps", "over", "the", "lazy", "dog" }; 

     var query = items.OrderBy(x => !x.Contains("o")) 
         .ThenBy(x => x); 

     foreach (string word in query) 
     { 
      Console.WriteLine(word); 
     } 
    } 
} 

を出力:

brown 
dog 
fox 
over 
jumps 
lazy 
quick 
the 
the 
+0

Heh。私はそれに例を挙げてみてください:) –

2

あなたは別のOrderBy句を使用することができます。

items = items.Where(a => a.Contains(contained)) 
    .OrderBy(a => a.StartsWith(contained) ? 0 : 1) 
    .ThenBy(a => a); 
関連する問題