C# 使用linq和lambdas将多分隔字符串添加到对象列表 概述

C# 使用linq和lambdas将多分隔字符串添加到对象列表 概述,c#,arrays,linq,lambda,C#,Arrays,Linq,Lambda,我有一个由逗号分隔的字符串,表示对象,空格表示这些对象的属性: string sOrderBy = "Column1 ASC, Column2 DESC"; 我需要将其转换为列表,其中OrderByColumn是: public class OrderByColumn { public string ColumnName { get; set; } public bool IsAscending { get; set; } } 问题 sOrderBy.Split(',')。选

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

string sOrderBy = "Column1 ASC, Column2 DESC";
我需要将其转换为
列表
,其中
OrderByColumn
是:

public class OrderByColumn
{
    public string ColumnName { get; set; }
    public bool IsAscending { get; set; }
}
问题
sOrderBy.Split(',')。选择(x=>neworderbycolumn()
{
ColumnName=x.Trim().Split(“”)[0]。Trim(),
IsAscending=x.Trim().Split(“”)[1]。Trim()=“ASC”?真:假
}).ToList();
上面的代码可以工作,但是多次调用
x.Trim().Split(“”)
会有一些冗余。(另外,我知道代码当前假定存在0和1数组值)

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


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

选择中引入一个临时变量怎么样

sOrderBy.Split(',').Select(x => 
    {
        var trimmedSplitted = x.Trim().Split(' ');
        return new OrderByColumn()
        {
            ColumnName = trimmedSplitted[0].Trim(),
            IsAscending = (trimmedSplitted[1].Trim() == "ASC")
        };
    }
).ToList<OrderByColumn>()
sOrderBy.Split(',')。选择(x=>
{
var trimmedSplitted=x.Trim().Split(“”);
返回新的OrderByColumn()
{
ColumnName=trimmedSplitted[0]。Trim(),
IsAscending=(trimmedSplitted[1]。Trim()=“ASC”)
};
}
)托利斯先生()

选择中引入一个临时变量怎么样

sOrderBy.Split(',').Select(x => 
    {
        var trimmedSplitted = x.Trim().Split(' ');
        return new OrderByColumn()
        {
            ColumnName = trimmedSplitted[0].Trim(),
            IsAscending = (trimmedSplitted[1].Trim() == "ASC")
        };
    }
).ToList<OrderByColumn>()
sOrderBy.Split(',')。选择(x=>
{
var trimmedSplitted=x.Trim().Split(“”);
返回新的OrderByColumn()
{
ColumnName=trimmedSplitted[0]。Trim(),
IsAscending=(trimmedSplitted[1]。Trim()=“ASC”)
};
}
)托利斯先生()
sOrderBy.Split(“,”)
.Select(csv=>csv.Trim().Split(“”))
.Select(splitBySpaces=>neworderbycolumn()
{
ColumnName=splitBySpaces[0]。Trim(),
IsAscending=(拆分空间[1]。Trim()=“ASC”)
})
托利斯先生()
sOrderBy.Split(“,”)
.Select(csv=>csv.Trim().Split(“”))
.Select(splitBySpaces=>neworderbycolumn()
{
ColumnName=splitBySpaces[0]。Trim(),
IsAscending=(拆分空间[1]。Trim()=“ASC”)
})
托利斯先生()

您只需添加一个提取选择:

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

我希望这对您有用。

您只需添加一个摘录选择:

sOrderBy.Split(',').
    Select(x => x.Trim().Split(' ')).
    Select(x => new OrderByColumn(){
        ColumnName = x[0].Trim(), 
        IsAscending = x[1].Trim() == "ASC"}).
    ToList()
我希望这对你有帮助