使用Linq基于逗号分隔的属性值拆分List <T>

Ser*_*eit 5 c# linq

鉴于此类:

public class Article
{
   public string Name { get; set; }
   public string Colour { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

假设我有以下内容List<Article>,其中一些文章包含逗号分隔的名称:

var list = new List<Article> 
{
    new Article { Name = "Article1, Article2, Article3", Colour = "Red" },
    new Article { Name = "Article4, Article5, Article6", Colour = "Blue" },
}
Run Code Online (Sandbox Code Playgroud)

在一个Linq声明中,有没有办法获得一个列表,其中每个逗号分隔的名称成为一个单独的文章?

var list = new List<Article> 
{
    new Article { Name = "Article1", Colour = "Red" },
    new Article { Name = "Article2", Colour = "Red" },
    new Article { Name = "Article3", Colour = "Red" },
    new Article { Name = "Article4", Colour = "Blue" },
    new Article { Name = "Article5", Colour = "Blue" },
    new Article { Name = "Article6", Colour = "Blue" },
}
Run Code Online (Sandbox Code Playgroud)

das*_*ght 9

你可以这样做SelectMany:

var res = list.SelectMany(
    art => art.Name.Split(',').Select(n =>
        new Article {
            Name = n.Trim()
        ,   Colour = art.Colour
        }
    )
);
Run Code Online (Sandbox Code Playgroud)

演示.

我希望有一种方法可以节省我新建物品,因为我的班级有超过两个属性

虽然你无法完全避免 - 但是你可以new通过隐藏单个属性的复制来提高代码的可读性Article,如下所示:

public class Article {
    public string Name { get; set; }
    public string Colour { get; set; }
    public Article Rename(string newName) {
        return new Article {
            Name = newName
        //  Copy the remaining attributes
        ,   Colour = this.Colour
        };
    }
}
Run Code Online (Sandbox Code Playgroud)

现在你的LINQ看起来像这样:

var res = list.SelectMany(art => art.Name.Split(',').Select(n => art.Rename(n.Trim())));
Run Code Online (Sandbox Code Playgroud)

这并没有删除任何代码,只是重新调整了一些代码.但是,放置复制Article属性Article会降低您忘记复制新添加的属性的机会.