LINQ顺序按字母顺序后跟空字符串

rob*_*rus 15 c# linq

我有一个字符串集合:

"", "c", "a", "b".
Run Code Online (Sandbox Code Playgroud)

我想使用LINQs orderby,以便顺序是按字母顺序排列的,但最后是空字符串.所以在上面的例子中,顺序是:

"a", "b", "c", ""
Run Code Online (Sandbox Code Playgroud)

Oli*_*ver 33

你可以使用类似的东西:

var result = new[] { "a", "c", "", "b", "d", }
    .OrderBy(string.IsNullOrWhiteSpace)
    .ThenBy(s => s);

 //Outputs "a", "b", "c", "d", ""
Run Code Online (Sandbox Code Playgroud)

  • 这很酷.你甚至不需要第一个排序的lambda,所以`source.OrderBy(string.IsNullOrWhiteSpace).ThenBy(s => s)`. (2认同)

Ada*_*rth 7

或者现有的答案,你可以提供一个IComparer<string>OrderBy过载:

class Program
{
    static void Main(string[] args)
    {
        var letters = new[] {"b", "a", "", "c", null, null, ""};

        var ordered = letters.OrderBy(l => l, new NullOrEmptyStringReducer());

        // Results: "a", "b", "c", "", "", null, null

        Console.Read();
    }
}

class NullOrEmptyStringReducer : IComparer<string>
{
    public int Compare(string x, string y)
    {
        var xNull = x == null;
        var yNull = y == null;

        if (xNull && yNull)
            return 0;

        if (xNull)
            return 1;

        if (yNull)
            return -1;

        var xEmpty = x == "";
        var yEmpty = y == "";

        if (xEmpty && yEmpty)
            return 0;

        if (xEmpty)
            return 1;

        if (yEmpty)
            return -1;

        return string.Compare(x, y);
    }
}
Run Code Online (Sandbox Code Playgroud)

我没有声明这是一个很好IComparer实现示例(它可能需要进行空检查并处理两个字符串是否为空),但答案的重点是演示OrderBy重载,至少可以使用问题的样本数据.

由于评论中的反馈和我自己的好奇心,我提供了一个稍微复杂一点的实现,它还负责相对于彼此排序空字符串和空字符串.没有处理空格.

不过,关键是提供的能力IComparer<string>,而不是你选择写它的能力:-)

  • 你的`NullOrEmptyStringReducer`类可以指定`Comparer <string>`作为它的基类.然后该方法应该是继承的`abstract`方法的`override`.这很简单.优点是你可以免费获得通用的"IComparer <>"和非通用的"IComparer".这是一个价格的两个.(好吧,即使你只需要一个.) (3认同)