假设我有一节课

public class Movie
    {
        public string Title { get; set; }
        public string Genre { get; set; }
        public int Rating { get; set; }
    }

和一个电影文本文件,它将被解析成一个列表

The_Godfather Action 96
The_Dark_Knight Drama 24
Cleopatra Comedy 61
Sabotage Action 88
Inception Drama 86
The_Matrix Comedy 14
Life_Is_Beautiful Drama 19
City_of_God Horror 12
Raven Comedy 30
Breaking_Wind Comedy 59
City_Lights Documentary 46
Born_Wild Drama 55

和一个函数

 public static Dictionary<string, Movie> HighestRatingForEachGenre(List<Movie> movies)
       

我想使用LINQ for each 流派返回最高评级.

我想按流派分组,然后返回每个流派的标题和电影对象.

我可以用Foreach循环很容易地做到这一点.

我仍然是LINQ的新手,不知道go 哪里找.

基本方法

            Dictionary<string, Movie> result = new Dictionary<string, Movie>();
            foreach (Movie movie in movies)
            {
                if (result.ContainsKey(movie.Genre))
                {
                    if (result[movie.Genre].Rating < movie.Rating) result.Remove(movie.Genre);
                    else continue;
                }
                result.Add(movie.Genre, movie);
            }
            return result;

推荐答案

要获得您想要的结果,您的LINQ表达式需要连续做三件事:

  1. 按类型对电影进行分组
  2. 从每组中提取排名靠前的电影
  3. 将生成的集合映射到词典.

第一步是按类型对电影进行分组,这可以用movies.GroupBy(m => m.Genre)部来完成.这将产生组的集合,其中每个组具有(1)key=公共类型和(2)共享该类型的电影的集合.m => m.Genre部分是 Select 哪个属性定义所需分组的lambda function.

接下来,在每个组中,您要 Select 收视率最高的电影.这可以使用Select(...).OrderBy(...).First()的组合来完成.就像.Select(grp => grp.OrderByDescending(m => m.Rating).First())年.

最后,.ToDictionary(...)可以构建结果的字典,将m => m.Genre指定为字典键 Select 器.

将所有这些放在一起,可以得出以下结论:

var highestRatingForEachGenre = movies
    .GroupBy(m => m.Genre)
    .Select(grp => grp.OrderByDescending(m => m.Rating).First())
    .ToDictionary(m => m.Genre);

(最后两行实际上可以合并为.ToDictionary()函数的更高级形式,但我认为单独的步骤更容易阅读和理解.)

上面使用LINQ method syntax来执行操作.使用LINQ query syntax也可以做到这一点.(我很少这样做,所以我不能随便举个例子.)

我建议您阅读所使用的每种方法的文档,以便了解上述方法的工作原理.

Csharp相关问答推荐

C#中的两个线程之间读写浮点类型

.NET框架4.7.2项目如何引用.NET Core 2.2库?

安装附加的. exe与Visual Studio

C++/C#HostFXR通过std::tuple传递参数

在发布表单时绑定包含附加(嵌套)列表的对象列表的正确语法是什么

XUNIT是否使用测试数据的源生成器?

C#XmlSerializer-输出控制新行的多个XML片段

需要在重新启动ApplicartionPool或IIS后启动/唤醒API的帮助

将字节转换为 struct 并返回

从VS调试器而不是测试资源管理器运行的调试NUnitDotNet测试

HttpRequestMessage.SetPolicyExecutionContext不会将上下文传递给策略

在字符串C#之前获取数字

CRL已过期,但ChainStatus告诉我RevocationStatus未知

{ or ; expected error如何解决此问题

多个选项卡上的MudForm验证

VS代码扩展无法在新版本扩展C#中运行从v2.10.28开始

为什么在使用JsonDerivedType序列化泛型时缺少$type?

FakeItEasy自动嘲弄内容

多个参数的最小API删除

ASP.NET核心8:app.UseStaticFiles()管道执行顺序