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

时间:2013-09-13 12:25:03

标签: c# linq

我有一系列字符串:

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

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

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

3 个答案:

答案 0 :(得分:31)

您可以使用以下内容:

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

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

答案 1 :(得分: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实现的示例(如果两个字符串都为空,它可能需要进行空检查和处理),但是答案的要点是展示OrderBy重载,至少可以解决问题的样本数据。

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

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

答案 2 :(得分:0)

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