使用linq和lambdas的多分隔字符串到对象列表

时间:2012-10-02 18:29:43

标签: c# arrays linq lambda

概述

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

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&amp; 1数组值存在)。

有没有办法删除这种冗余?以某种方式将x.Trim().Split(' ')的结果传递给匿名函数,然后从那里返回一个OrderByColumn对象?

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

3 个答案:

答案 0 :(得分: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>()

答案 1 :(得分:4)

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

答案 2 :(得分:0)

您只需添加提取选择:

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

我希望这对你有用。