Порядок LINQ по алфавиту, за которым следует пустая строка

У меня есть набор строк:

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

Я хочу использовать LINQs orderby, чтобы порядок был алфавитным, но с пустыми строками. Таким образом, в приведенном выше примере порядок будет выглядеть следующим образом:

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

Ответ 1

Вы можете использовать что-то вроде:

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

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

Ответ 2

В качестве альтернативы существующим ответам вы можете предоставить 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>, а не то, насколько хорошо вы решили написать его: -)

Ответ 3

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