У меня есть набор строк:
"", "c", "a", "b".
Я хочу использовать LINQs orderby
, чтобы порядок был алфавитным, но с пустыми строками. Таким образом, в приведенном выше примере порядок будет выглядеть следующим образом:
"a", "b", "c", ""
У меня есть набор строк:
"", "c", "a", "b".
Я хочу использовать LINQs orderby
, чтобы порядок был алфавитным, но с пустыми строками. Таким образом, в приведенном выше примере порядок будет выглядеть следующим образом:
"a", "b", "c", ""
Вы можете использовать что-то вроде:
var result = new[] { "a", "c", "", "b", "d", }
.OrderBy(string.IsNullOrWhiteSpace)
.ThenBy(s => s);
//Outputs "a", "b", "c", "d", ""
В качестве альтернативы существующим ответам вы можете предоставить 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>
, а не то, насколько хорошо вы решили написать его: -)
string[] linqSort = { "", "c","x", "a","" ,"b","z" };
var result = from s in linqSort
orderby string.IsNullOrEmpty(s),s
select s;