【问题标题】:Splitting List<T> based on comma separated property value using Linq使用 Linq 基于逗号分隔的属性值拆分 List<T>
【发布时间】:2015-09-06 19:12:59
【问题描述】:

鉴于这个类:

public class Article
{
   public string Name { get; set; }
   public string Colour { get; set; }
}

假设我有以下List&lt;Article&gt;,其中一些文章包含逗号分隔的名称:

var list = new List<Article> 
{
    new Article { Name = "Article1, Article2, Article3", Colour = "Red" },
    new Article { Name = "Article4, Article5, Article6", Colour = "Blue" },
}

有没有办法在一个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" },
}

【问题讨论】:

    标签: c# linq


    【解决方案1】:

    您可以使用SelectMany

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

    Demo.

    我希望有一种方法可以节省我更新对象的时间,因为我的类 [...] 有两个以上的属性

    虽然您无法完全避免new-ing,但您可以通过将各个属性的复制隐藏在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
            };
        }
    }
    

    现在您的 LINQ 将如下所示:

    var res = list.SelectMany(art => art.Name.Split(',').Select(n => art.Rename(n.Trim())));
    

    这并没有删除任何代码,只是重新洗牌了一些。但是,将 Article 的属性复制到 Article 可以减少您忘记复制新添加的属性的机会。

    【讨论】:

    • 太棒了,谢谢。我非常接近非常像这样的东西,但我希望有一种方法可以节省我的新对象,因为我的类是 DTO,而且你可以想象,它有两个以上属性 ;)
    • @SergiPapaseit 这是一个公平的观察。尽管您无法完全避免 new,但您可以重构代码以获得更好的可维护性。
    • 简洁的方法。如果可以的话,我会再次投票给你 ;) 我最终所做的是将 linq 的转换位隐藏在扩展方法中。
    • 我认为这里的查询语法会更自然:from article in list from name in article.Name.Split(',') select new Article { Name = name.Trim(), Colour = article.Colour }.
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-26
    相关资源
    最近更新 更多