使用Linq加入一个字符串属性,该属性位于对象列表中

时间:2014-07-08 12:56:57

标签: c# linq

我有一组像这样的对象:

class ObjectA
{
    public string NameA {get;set;}
    public List<ObjectB> ListObjectB {get;set;}
}

class ObjectB
{
    public string NameB {get;set;}
    public ObjectBDetails Details {get;set;}
}

class ObjectBDetails 
{
    public string Code {get;set;}
    public string Sector {get;set;}
}

我有一个List ObjectA,其中包含一些项目。

我喜欢做的是获取所有项目的Sector字符串,并将其写成逗号分隔的字符串。

例如,我可以这样做:

string tmp = "";
foreach(var objA in ListObjectA)
{
    foreach(var objB in objA.ListObjectB)
    {
        tmp += objB.ObjectDetails.Sector + ", ";
    }
}

这“愿意”有效。唯一的问题是它总是以,结束,这不太好。

但我也认为使用Linq做一个更好的解决方案。但我无法弄清楚该怎么做。我试过这样的事情,但显然它没有用完:

var a = objA.ListObjectB.Aggregate((current, next) => current.ObjectBDetails.Sector + ", " + next.ObjectBDetails.Sector);

所以我实际上正在寻找一种方法来Linq。任何人都知道如何做到这一点?

2 个答案:

答案 0 :(得分:3)

您可以使用string.Join和LINQ SelectMany组合:

var a  = string.Join(", ", ListObjectA.SelectMany(x => x.ListObjectB)
                                      .Select(x => x.Details.Sector));

这是数据:

var ListObjectA = new List<ObjectA>();
ListObjectA.Add(new ObjectA()
{
    ListObjectB = new List<ObjectB>() { 
        new ObjectB() { Details = new ObjectBDetails() { Sector = "A1" }},
        new ObjectB() { Details = new ObjectBDetails() { Sector = "A2" }},
    }
});
ListObjectA.Add(new ObjectA()
{
    ListObjectB = new List<ObjectB>() { 
        new ObjectB() { Details = new ObjectBDetails() { Sector = "B1" }}
    }
});

生成"A1, A2, B1"

答案 1 :(得分:-1)

试试这个:

var a = objA.ListObjectB.Aggregate((current, next) => current.Sector + ", " + next.Sector);