簡體   English   中英

Linq 到對象,列表<items> ,其中項目由列表組成<items2></items2></items>

[英]Linq To Objects, List<Items>, where Items consist of List<Items2>

我有List<Book> ,在哪里

public class Book
{
    public string Name {get; set;}
    public List<Author> Authors {get; set;}
}

public class Author
{
    public string FirstName {get; set;}
    public string LastName {get; set;}
}

我需要獲得<FirstName, BooksCount> ,每個作者的書數。 我了解,我需要使用 GroupBy,但獲取List<Author>而不是<FirstName, BooksCount>

試試這個。 我按 FullName 而不是 FirstName 進行分組,因為我非常懷疑 FirstName 可能是唯一標識符。 FullName 更好,但仍然不能是唯一的。 如果需要,您可以將.GroupBy(a => $"{a.FirstName} {a.LastName}")更改為.GroupBy(a => a.FirstName")

            List<Book> books = new List<Book>() { 
            new Book { Name = "b1", 
                Authors = new List<Author>() { 
                    new Author { FirstName = "a1fn", LastName = "a1ln" }, 
                    new Author { FirstName = "a2fn", LastName = "a2ln" } } 
            }, 
            new Book { Name = "b2", 
                Authors = new List<Author>() { 
                    new Author { FirstName = "a1fn", LastName = "a1ln" } } 
            }, new Book { Name = "b3", 
                Authors = new List<Author>() { 
                    new Author { FirstName = "a2fn", LastName = "a2ln" } } 
            }, new Book { Name = "b4",
                Authors = new List<Author>() {
                    new Author { FirstName = "a2fn", LastName = "a2ln" } }
            } };

            var result = books.SelectMany(b => b.Authors)
                .GroupBy(a => $"{a.FirstName} {a.LastName}")
                .Select(g => new { FullName = g.Key, BooksCount = g.Count() });

顯然有些書是由幾位作者寫的。

您有一系列由一個或多個作者撰寫的書籍,並且您想要一種方法將此序列轉換為包含所寫書籍的作者序列。

Book     Author(s)
  A      author1
  B      author2
  C      author3
  D      author1, author3
  E      author2, author3

我們首先將其展平:獲取組合 [Book, Author],然后按同一作者分組:

展平后:

 Book    Author(s)
  A      author1
  B      author2
  C      author3
  D      author1,
  D      author3
  E      author2,
  E      author3

同一作者分組后:

Author      Books
author1     A, D
author2     B, E
author3     C, D, E

使用 SelectMany 進行展平 使用 GroupBy 完成每個組成員具有共同值的項目組

IEnumerable<Book> books = ...
var authorsWithTheirBooks = books.SelectMany(book => book.Authors,

    // parameter ResultSelector: take every [book, author] combination to make one new
    (book, author) => new
    {
        Book = book,
        Author = author,
    })

    // now make groups with same Author:
    .GroupBy(flattenResult => flattenResult.Author,

    // resultSelector: take every author, and the books of this author to make one new
    (author, booksOfThisAuthor => new
    {
        Author = author,
        Books = booksOfThisAuthor.ToList(),
    });

好吧,你不想要這個作者的所有書,你只想要書的數量:

    (author, booksOfThisAuthor => new
    {
        Author = author,
        Books = booksOfThisAuthor.Count(),
    });

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM