Jeffrey Taylor Ответов: 2

Переставить c# список объектов, когда один объект дубликатами


У меня есть список в C# , определенный следующим образом:

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

List<Author> originalAuthorList = new List<Author>
{
    new Author{ Name = "Bob", Age = "30", Address = "123 Main St.", Book = "Bob's First Book", },
    new Author{ Name = "Dan", Age = "32", Address = "456 main St.", Book = "Dan's First Book" },
    new Author{ Name = "Dan", Age = "32", Address = "456 main St.", Book = "Dan's Second Book" },
    new Author{ Name = "Tom", Age = "34", Address = "789 main St.", Book = "Tom's First Book" }
};


Как я могу изменить список, чтобы он выглядел так:
List<Author> newAuthorList = new List<Author>
{
    new Author{ Name = "Bob", Age = "30",  Address = "123 Main St.", Book = "Bob's First Book" },
    new Author{ Name = "Dan", Age = "32",  Address = "456 Main St.", Book = "Dan's First Book, Dan's Second Book" },
    new Author{ Name = "Tom", Age = "34",  Address = "789 Main St.", Book = "Tom's First Book" }
};


Что я уже пробовал:

Я знаю, что если бы у меня было только 2 поля, например, имя и книга, я мог бы сделать это:

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();


Но как бы я включил все 4 поля в новый список?

BillWoodruff

если у вас есть контроль над структурой класса Author и форматом данных, используемым для создания экземпляров этого класса: если вы можете изменить 'Books from string to List<string> :

Я поделюсь с тобой кое-каким кодом ... по вашему запросу

2 Ответов

Рейтинг:
2

George Swan

Если вы знакомы с Linq, вы можете сделать что-то вроде этого


var authors = originalAuthorList.
GroupBy(a => (a.Name, a.Age, a.Address), a => a.Book);
foreach (var grp in authors)
  {
   Console.WriteLine($"Name={grp.Key.Name}, Age={grp.Key.Age}, Address={grp.Key.Address} Books {string.Join(", ", grp)}");
  }


BillWoodruff

+5 я кое-чему научился, когда ты использовал веревку.Присоединяйтесь к коду ! Это продвинутый пример.

С таким же успехом можно было бы перейти в словарь ?

var dict = авторы.ToDictionary(
ВРП =&ГТ; стеклопластик.Ключ, ГРП => строка.Присоединиться(", ", стеклопластик)
);

спасибо, Билл

George Swan

Спасибо, Билл. Использование словаря, вероятно, является наиболее эффективным решением. Я нахожу, что обычно существуют более быстрые решения, чем Linq, но писать их не так весело. С Уважением, Джордж.

Рейтинг:
2

OriginalGriff

Начать здесь: Использование Linq для создания словаря вложенных списков путем группировки из коллекции.[^]
Это позволяет создать словарь, в котором имя автора является ключом, а список всех его записей автора-значением.
Затем вы можете пробежаться по каждой группе и использовать Строку.Присоединяйтесь[^] чтобы изменить список книг на список запятых под новой записью автора.