私は文字列のコレクションを持っています:
"", "c", "a", "b".
orderby
順序がアルファベット順で、空の文字列が最後になるようにLINQ を使用したいと考えています。したがって、上記の例では、順序は次のようになります。
"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
(両方の文字列が空の場合はおそらく null チェックと処理が必要です)、答えのポイントはOrderBy
オーバーロードを実証することであり、少なくとも質問のサンプルデータ。
コメントでのフィードバックと私自身の好奇心により、空の文字列と null 文字列の相対的な順序付けも処理する、もう少し複雑な実装を提供しました。空白は処理されません。
それでも、重要なのは、それをどれだけうまく書くかではなく、提供する能力IComparer<string>
です:-)
string[] linqSort = { "", "c","x", "a","" ,"b","z" };
var result = from s in linqSort
orderby string.IsNullOrEmpty(s),s
select s;