LINQ按字母顺序排序,空字符串排在后面

20

我有一组字符串:

"", "c", "a", "b".

我想使用LINQ的orderby,使得顺序为按字母顺序排序,但是空字符串排在最后。因此,在上面的例子中,顺序将是:

"a", "b", "c", ""
3个回答

39

你可以使用类似下面的代码:

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

 //Outputs "a", "b", "c", "d", ""

3
很棒,对于第一个排序操作,甚至不需要使用lambda表达式,可以使用 source.OrderBy(string.IsNullOrWhiteSpace).ThenBy(s => s) - Jeppe Stig Nielsen

7

除了现有的答案之外,您还可以为OrderBy重载提供一个IComparer<string>

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);
    }
}

我不是在说这是一个很好的IComparer实现的例子(它可能需要进行空值检查,并处理如果两个字符串都为空的情况),但答案的重点是演示了OrderBy重载,并且至少可以处理问题中的样本数据。
由于评论中的反馈和我的好奇心,我提供了一个稍微复杂一些的实现,它还处理了相对于彼此为空字符串和null字符串的排序。空格未被处理。
仍然,重点是能够提供IComparer,而不是你选择编写得有多好:-)

1
在这种情况下,这可能是微不足道的,但有一些问题,如果xy都为空/ null,它将不会返回0。编辑:啊,最后一个好警告。+1 - Chris Sinclair
1
@ChrisSinclair 你可能是正确的,但正如我在免责声明中所述,该实现并不是完整/正确的生产消费示例,但它演示了使用OrderBy的想法,并且至少可以使用提供的示例数组。答案的重点不在于实现,而在于OrderBy重载。 - Adam Houldsworth
@ChrisSinclair 是的,string.Compare 能够做到这一点,但在这种情况下它不会被执行。 - Sriram Sakthivel
@ChrisSinclair 我屈服于同行的压力。 - Adam Houldsworth
3
你的 NullOrEmptyStringReducer 类可以指定 Comparer<string> 作为它的基类。然后该方法应该重写继承的 abstract 方法。这样很容易。优点是你可以免费获得通用的 IComparer<> 和非通用的 IComparer,相当于一次性获取两者(即使你只需要其中之一)。 - Jeppe Stig Nielsen
显示剩余4条评论

0
string[] linqSort = { "", "c","x", "a","" ,"b","z" };
var result = from s in linqSort
             orderby  string.IsNullOrEmpty(s),s
             select s;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接