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

Jad*_*ias 0 .net c# 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));
Run Code Online (Sandbox Code Playgroud)

我该怎么办?

Mic*_*hue 5

用startsWith.Concat替换startsWith.Union


Jon*_*eet 5

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

items = items.OrderBy(x => !x.Contains(contained))
             .ThenBy(x => x);
Run Code Online (Sandbox Code Playgroud)

注意false事先排序true!在这里 - 您还可以使用条件来使其更清晰:

items = items.OrderBy(x => x.Contains(contained) ? 0 : 1)
             .ThenBy(x => x);
Run Code Online (Sandbox Code Playgroud)

测试程序:

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);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

输出:

brown
dog
fox
over
jumps
lazy
quick
the
the
Run Code Online (Sandbox Code Playgroud)