1

概要

オブジェクトを表すコンマで区切られた文字列と、それらのオブジェクトのプロパティを表すスペースがあります。

string sOrderBy = "Column1 ASC, Column2 DESC";

List<OrderByColumn>それを次の場所に変換する必要がOrderByColumnあります。

public class OrderByColumn
{
    public string ColumnName { get; set; }
    public bool IsAscending { get; set; }
}

問題

sOrderBy.Split(',').Select(x => new OrderByColumn()
{
    ColumnName = x.Trim().Split(' ')[0].Trim(),
    IsAscending = x.Trim().Split(' ')[1].Trim() == "ASC" ? true : false
}).ToList<OrderByColumn>();

上記のコードは機能しますが、x.Trim().Split(' ')複数回呼び出すには冗長性があります。(また、コードは現在、0 と 1 の配列値があると想定していることを認識しています)。

この冗長性を取り除く方法はありますか? どういうわけかx.Trim().Split(' ')無名関数に結果を渡し、OrderByColumnそこからオブジェクトを返しますか?

2 つの for/foreach ループを使用してこの問題を解決できることはわかっていますが、linq とラムダはとてもクールです! :-)

4

3 に答える 3

11

Select:内に一時変数を導入するのはどうですか?

sOrderBy.Split(',').Select(x => 
    {
        var trimmedSplitted = x.Trim().Split(' ');
        return new OrderByColumn()
        {
            ColumnName = trimmedSplitted[0].Trim(),
            IsAscending = (trimmedSplitted[1].Trim() == "ASC")
        };
    }
).ToList<OrderByColumn>()
于 2012-10-02T18:33:08.800 に答える
4
sOrderBy.Split(',')
        .Select(csv=> csv.Trim().Split(' '))
        .Select(splitBySpaces => new OrderByColumn()
                     {
                         ColumnName = splitBySpaces[0].Trim(),
                         IsAscending = (splitBySpaces[1].Trim() == "ASC")
                     })
        .ToList<OrderByColumn>()
于 2012-10-02T18:33:18.270 に答える
0

抽出選択を追加するだけです:

sOrderBy.Split(',').
    Select(x => x.Trim().Split(' ')).
    Select(x => new OrderByColumn(){
        ColumnName = x[0].Trim(), 
        IsAscending = x[1].Trim() == "ASC"}).
    ToList()

これがうまくいくことを願っています。

于 2012-10-02T18:36:13.933 に答える