Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用linq进行高级分组和聚合_C#_Linq_Group By - Fatal编程技术网

C# 使用linq进行高级分组和聚合

C# 使用linq进行高级分组和聚合,c#,linq,group-by,C#,Linq,Group By,我的计划如下: void Main() { List<Online_video_for_programmers> current_year_videos = new List<Online_video_for_programmers>() { new Online_video_for_programmers { video_name="websocket for fortran programmers",

我的计划如下:

 void Main()
{



List<Online_video_for_programmers> current_year_videos = new List<Online_video_for_programmers>()
    {
    new Online_video_for_programmers
        {
        video_name="websocket for fortran programmers",
        season=2,
        seasontype=1,
        year=2012
        },
        new Online_video_for_programmers
        {
        video_name="cross site scripting for facebook addicts",
        season=3,
        seasontype=2,
        year=2012
        },

        new Online_video_for_programmers
        {
        video_name="Artificial intelligence for self aware robots",
        season=1,
        seasontype=1,
        year=2012
        }
        ,
        new Online_video_for_programmers
        {
        video_name="Artificial intelligence for self aware robots",
        season=3,
        seasontype=1,
        year=2012
        },

        new Online_video_for_programmers
        {
        video_name="Artificial intelligence for adavanced robots",
        season=5,
        seasontype=1,
        year=2012
        },
    new Online_video_for_programmers
        {
        video_name="Yoga for programmers",
        season=2,
        seasontype=2,
        year=2012
        },
        new Online_video_for_programmers
        {
        video_name="Yoga for programmers",
        season=3,
        seasontype=2,
        year=2012
        }


    };

    //Last years videos sold

List<Online_video_for_programmers> last_year_videos = new List<Online_video_for_programmers>()
    {
    new Online_video_for_programmers
        {
        video_name="websocket for fortran programmers",
        season=2,
        seasontype=1,
        year=2011,
        },
        new Online_video_for_programmers
        {
        video_name="cross site scripting for facebook addicts",
        season=3,
        seasontype=1,
        year=2011,
        },

        new Online_video_for_programmers
        {
        video_name="Artificial intelligence for self aware robots",
        season=2011,
        seasontype=3,
        year=2011,
        }
        ,

    new Online_video_for_programmers
        {
        video_name="Yoga for programmers",
        season=4,
        seasontype=2,
        year=2011,
        },
            new Online_video_for_programmers
        {
        video_name="Yoga for programmers",
        season=2,
        seasontype=2,
        year=2011
        }

};
}
// Define other methods and classes here





 public class Online_video_for_programmers
    {
    public int seasontype {get;set;} //this can be the id of a year, a quater or  month  Tyepes are 1: months, 2, for quarters, 3 for year
public int season {get;set;} //  when season type is 1, season =1 means january. 
    //When season type is 2, season=3 means 3rd quater. When seasontype is 3, season =2011 or 2010 etc... 
        public string video_name {get;set;} //The nambe of the video
        public int year {get;set;} // The year the video was published
}  
上面的代码为我提供了今年和去年生产的代码,因此我可以很容易地找到丢失的代码


这就是问题所在。2011年全年制作了视频“用于自我感知机器人的人工智能”,2012年每月制作3次。 我不想在2012年看到这一点。只有在2012年完全没有生产的情况下,它才会丢失。问题是,如何调整我的查询以将此条件包括在结果中。 到目前为止,我花了一些时间思考不同的事情,但没有成功

希望有人能帮忙

非常感谢

var result = 
    last_year_videos
       .Select(v => new { v.video_name, v.season })
       .Except(current_year_videos.Select(v => new { v.video_name, v.season }));
给出:

{ video_name = "Artificial intelligence for self aware robots", season = 2011 }
{ video_name = "Yoga for programmers", season = 4 }
更新:如果您想在查看视频时处理季节类型(月、季、年),则可以创建将季节和季节类型转换为月份列表的方法:

private static IEnumerable<int> GetMonths(Online_video_for_programmers video)
{
    switch (video.seasontype)
    {
        case 1: return Enumerable.Range(video.season, 1);
        case 2: return Enumerable.Range((video.season - 1) * 3 + 1, 3);
        case 3: return Enumerable.Range(1, 12);
        default:
            throw new ArgumentException("Unknown season type");
    }
}
返回:

"cross site scripting for facebook addicts" // Month 3
"Yoga for programmers" // Months 9,10,11
您想找到:

哪些书名是去年出版的,而不是今年出版的

但为此,不需要分组:

var result = last_year_videos
    .Where(vLast => !current_year_videos
        .Select(vCurrent => vCurrent.video_name).Contains(vLast.video_name));

您所要做的就是检查去年的收藏中是否存在带有选定键(
video\u name
)的视频。

检查名称。我同意所有这些都存在于去年的收藏品中。尽管如此,据我所知,这是问题的解决方案。即使您将视频_名称替换为匿名对象,您的查询也非常低效-它会投影当年视频并搜索列表年列表中的每个视频。亲爱的Lazyberezovsky,此代码存在问题。它不应该报告“用于自我感知机器人的人工智能”缺失。它是在2011年制作的。只有在完全没有生产的情况下,才应报告为丢失。@MeelfanBmfp没有,2012年它有四季
1,3,5
。但在2011年被命名为
2011
,因此它是不同的视频,并显示在结果中。也许你的样本数据有输入错误?没有,我没有解释得那么清楚。如果我们在一端找到全年的数据,在另一端找到任何其他形式的数据,则认为没有遗漏。“用于自我感知机器人的人工智能”于2011年全年制作一次。2012年,它是按月制作的。所以这里我们可以假设它没有丢失。我希望这是有意义的。“用于自我感知机器人的人工智能”于2011年生产,这是涵盖任何月份或任何季度的一整年。因此,这部电影从那一年起就没有丢失。如果是制作,比如说:2011年的1月和4月,2012年的5月和6月,那么我们会将2011年的5月和6月标记为缺失,因为这几个月没有制作这部电影。反过来,如果在2011年,它是在2个季度(包括5月和6月)生产的,那么这些生产不会被标记为缺失。2011年第二季度和5、6月份都是如此!你的代码和想法很棒,你是一个真正的天才。我从来没有想过转换的想法。万分感谢
"cross site scripting for facebook addicts" // Month 3
"Yoga for programmers" // Months 9,10,11
var result = last_year_videos
    .Where(vLast => !current_year_videos
        .Select(vCurrent => vCurrent.video_name).Contains(vLast.video_name));