【问题标题】:Rearrange a C# list of objects when one property has duplicates [duplicate]当一个属性重复时,重新排列 C# 对象列表 [重复]
【发布时间】:2020-09-22 23:30:12
【问题描述】:

我在 C# 中有一个这样定义的列表:

public class Author  
{  
    public string Name { get; set; }  
    public string Book { get; set; }    
} 

List<Author> originalAuthorList = new List<Author>
{
    new Author{ Name = "Bob", Book = "Bob's First Book" },
    new Author{ Name = "Dan", Book = "Dan's First Book" },
    new Author{ Name = "Dan", Book = "Dan's Second Book" },
    new Author{ Name = "Tom", Book = "Tom's First Book" }
};

我怎样才能将列表重新排列成这样?

List<Author> newAuthorList = new List<Author>
{
    new Author{ Name = "Bob", Book = "Bob's First Book" },
    new Author{ Name = "Dan", Book = "Dan's First Book, Dan's Second Book" },
    new Author{ Name = "Tom", Book = "Tom's First Book" }
};

换句话说,当一个作者有几本书时,我不希望该作者的列表中有多个项目。我希望每位作者都出现在列表中一次,并且该作者的所有书籍都列在 book 字段中。

【问题讨论】:

  • 我们在 Stack Overflow 上已经有数百个(如果不是数千个)示例,说明如何在 C# 中对数据进行分组并为每个组合并一个或多个属性。例如。见重复。在您的情况下,您可能喜欢 string.Join() 为每个组创建新的 Book 值。
  • 我已经编辑了我的原始问题,以便列表中的每个项目都有 4 个字段。如何按 Id 对项目进行分组并将所有 4 个字段包含在新列表中?我看到的其他问题只有 2 个字段。
  • 请不要在发布问题后更改问题的基本方面。如果您的问题有一些新的方面仍然需要帮助,请发布一个新问题。在您的新问题中,请确保包含一个 minimal reproducible example,说明您到目前为止所做的工作,说明您迄今为止为解决新问题所做的尝试,以及您具体需要什么帮助。
  • 我试图发布一个新问题,但被告知我不能这样做,因为我昨天刚刚发布了这个问题。
  • 该站点确实具有限制活动的内置约束,尤其是新用户的活动。你将不得不等待。这应该不是问题;如果您有任何紧急需要,Stack Overflow 不适合寻求帮助。该网站的目的是随着时间的推移积累有用信息的数据库,而不是充当程序员的及时答疑台。

标签: c# list linq


【解决方案1】:

您只需使用GroupBy 然后Select 将结果投影到正确的类型,例如:

List<Author> newAuthorList = originalAuthorList
    .GroupBy(
        a => a.Name, // Group by name
        a => a.Book) // Select the book as the element
    .Select(g => new Author
    {
        Name = g.Key,
        Book = string.Join(", ", g) // Join the books together
    })
    .ToList();

【讨论】:

    【解决方案2】:

    首先,将数据排列到查找表中。

    var lookup = originalAuthorList.ToLookup
    (
        x => x.Name,
        x => x.Book
    );
    

    现在您有了一个姓名列表,每个姓名都与一个匹配该姓名的作者列表相关联。

    从那里,解决方案很简单:

    var newAuthorList = lookup.Select
    (
        x => new Author
        (
            Name = x.Key,
            Book = string.Join( ",", x.Select( y => y.Book) )
        )
    );
    

    【讨论】:

      猜你喜欢
      • 2010-10-26
      • 2019-12-15
      • 2019-09-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-11
      • 1970-01-01
      相关资源
      最近更新 更多