19

私は文字列のコレクションを持っています:

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

orderby順序がアルファベット順で、空の文字列が最後になるようにLINQ を使用したいと考えています。したがって、上記の例では、順序は次のようになります。

"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オーバーロードを実証することであり、少なくとも質問のサンプルデータ。

コメントでのフィードバックと私自身の好奇心により、空の文字列と null 文字列の相対的な順序付けも処理する、もう少し複雑な実装を提供しました。空白は処理されません。

それでも、重要なのは、それをどれだけうまく書くかではなく、提供する能力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 に答える