如何在C#中使用两个排序标准?

时间:2009-07-15 19:05:16

标签: c# .net linq c#-3.0

我有一组字符串。我想选择包含另一个字符串的所有字符串。但我希望将第一项作为搜索开头的项目,然后按字母顺序排列其他项目。但是以下代码不起作用:

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

我必须做什么?

3 个答案:

答案 0 :(得分:5)

用startsWith.Concat

替换startsWith.Union

答案 1 :(得分:5)

除了迈克尔的选择,您还可以通过布尔:

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

请注意,falsetrue之前排序,因此!在这里 - 您还可以使用条件来使其更清晰:

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 :(得分:2)

您可以使用其他OrderBy子句。

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