【发布时间】:2021-04-10 12:54:04
【问题描述】:
我有一个class book,它有一个属性IEnumerable<string> Tags:
public class Book
{
public Book(string title, IEnumerable<string> tags)
=> (Title, Tags) = (title, tags);
public string Title { get; }
public IEnumerable<string> Tags { get; }
}
现在我有了IEnumerable<Book> books,我只需要获取 ALL 对象之间的公共标签。
public static void TestMethod()
{
var book1 = new Book("Book1", new List<string> { "c#", ".net", "programming" });
var book2 = new Book("Book2", new List<string> { "ado", "c#" });
var book3 = new Book("Book3", new List<string> { "programming", "c#" });
var book4 = new Book("Book4", new List<string> { "ef-core", "database", ".net" });
var book5 = new Book("Book5", new List<string> { ".net", "visual-studio", "c#", "programming" });
var list1 = new List<Book> { book1, book2, book3 };
var list2 = new List<Book> { book1, book3, book5 };
var list3 = new List<Book> { book1, book4, book5 };
var list4 = new List<Book> { book1, book2, book4 };
// expected returns:
// list1 => { "c#" }
// list2 => { "c#", "programming" }
// list3 => { ".net" }
// list4 => { }
Console.WriteLine($"list1 => {{{string.Join(';', GetCommonTags(list1))}}}");
Console.WriteLine($"list2 => {{{string.Join(';', GetCommonTags(list2))}}}");
Console.WriteLine($"list3 => {{{string.Join(';', GetCommonTags(list3))}}}");
Console.WriteLine($"list4 => {{{string.Join(';', GetCommonTags(list4))}}}");
}
我真的不知道这样做的正确方法。直到那一刻,我都以这种可怕的方式来做这件事(在巴西,我们称之为“gambiarra”,或英语中的“Workaround”):
public static IEnumerable<string> GetCommonTags(IEnumerable<Book> books)
{
var allTags = books.SelectMany(b => b.Tags).Distinct();
var commonTags = new List<string>();
foreach (var tag in allTags)
{
var isCommonTag = true;
foreach (var book in books)
{
if (!book.Tags.Contains(tag))
{
isCommonTag = false;
break;
}
}
if (isCommonTag) commonTags.Add(tag);
}
return commonTags;
}
它正在工作,但如何正确地做到这一点,或者使用 linq?
【问题讨论】:
标签: c# .net linq collections