从C#中的另一个列表更新一个列表中的项目的最优雅方法是什么?

leo*_*ora 2 c# linq collections

我有2个集合,我有以下代码循环遍历一个集合,看看它是否存在于另一个集合中.如果确实存在,则更新该项的属性.

        foreach (var favorite in myFavoriteBooks)
        {
            var book = allBooks.Where(r => r.Name == favorite.Name).FirstOrDefault();

            if (book != null)
            {
                book.IsFavorite = true;
            }
        }
Run Code Online (Sandbox Code Playgroud)

是否有更优雅或更快的方式来实现上面的代码?

Ada*_*son 5

您可以使用Join扩展方法语法或LINQ语法来实现此目的:

扩展方法:

foreach(var favorite in myFavoriteBooks.Join(allBooks, 
                                             f => f.Name, 
                                             a => a.Name, 
                                            (f, a) => a))
{
    a.IsFavorite = true;
}
Run Code Online (Sandbox Code Playgroud)

LINQ:

var favorites = from f in myFavoriteBooks
                join a in allBooks on f.Name equals a.Name
                select a

foreach(var favorite in favorites)
{
    favorite.IsFavorite = true;
}
Run Code Online (Sandbox Code Playgroud)

这些解决方案功能相同; 它们的区别仅在于语法,它们比原始解决方案更快,因为LINQ将在两侧构建哈希表,并使用它来匹配而不是扫描原始列表中每个项目的其他列表.