1

概述

我有一个用逗号分隔的字符串,表示对象和空格,表示这些对象的属性:

string sOrderBy = "Column1 ASC, Column2 DESC";

我需要将其转换为List<OrderByColumn>where OrderByColumnis:

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从那里返回一个对象?

我知道我可以使用两个 for/foreach 循环来解决这个问题,但是 linq 和 lambdas 太酷了!:-)

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 回答