2009-07-15 57 views
0

我有一組字符串。我想選擇包含另一個字符串的所有字符串。但是我希望將第一項作爲搜索開始的項目,然後按字母順序排列其他項目。但下面的代碼不起作用:如何在C#中使用兩個排序條件?

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

我該怎麼辦?

+1

當你說'下面的代碼不起作用'實際發生了什麼? – 2009-07-15 19:07:05

+0

@Michael它只按字母順序排序 – 2009-07-15 23:21:50

回答

5

更換startsWith.Union與startsWith.Concat

5

除了邁克爾的選項,你也可以爲了通過布爾:

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

注意false排序前true因此!在這裏 - 你也可以使用條件,以使其更清晰:

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 
2

您可以使用另一個OrderBy條款。

items = items.Where(a => a.Contains(contained)) 
    .OrderBy(a => a.StartsWith(contained) ? 0 : 1) 
    .ThenBy(a => a);