19

我有一个字符串集合:

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

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

"a", "b", "c", ""
4

3 回答 3

36

你可以使用类似的东西:

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

 //Outputs "a", "b", "c", "d", ""
于 2013-09-13T12:26:24.173 回答
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);
    }
}

我没有说这是一个很好的实现示例IComparer(如果两个字符串都为空,它可能需要进行 null 检查和处理),但答案的重点是演示OrderBy重载,并且至少可以与问题的样本数据。

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

尽管如此,关键是提供的能力IComparer<string>,而不是您选择编写它的程度:-)

于 2013-09-13T12:29:40.917 回答
0
string[] linqSort = { "", "c","x", "a","" ,"b","z" };
var result = from s in linqSort
             orderby  string.IsNullOrEmpty(s),s
             select s;
于 2013-09-13T12:45:15.493 回答