[英]LINQ returns List<{int,double}> two values after .selected but I need List<int> with one value only
我有這個任務。 我需要創建以這種形式使用JSON數據的方法:
在輸入N上,電影的前N個是什么? 電影的分數是其平均評分
所以我有一個500萬的JSONfile。 里面的電影。 每行看起來像這樣:
{ Reviewer:1, Movie:1535440, Grade:1, Date:'2005-08-18'},
{ Reviewer:1, Movie:1666666, Grade:2, Date:'2006-09-20'},
{ Reviewer:2, Movie:1535440, Grade:3, Date:'2008-05-10'},
{ Reviewer:3, Movie:1535440, Grade:5, Date:'2008-05-11'},
該文件被反序列化,然后另存為IEnumerable。 然后我想創建一個方法,該方法返回List<int>
,其中int
是MovieId。 列表中的電影按降序排列,並且“頂部”電影的數量被指定為該方法的參數。
我的方法如下所示:
public List<int> GetSpecificAmountOfBestMovies(int amountOfMovies)
{
var moviesAndAverageGradeSortedList = _deserializator.RatingCollection()
.GroupBy(movieId => movieId.Movie)
.Select(group => new
{
Key = group.Key,
Average = group.Average(g => g.Grade)
})
.OrderByDescending(a => a.Average)
.Take(amountOfMovies)
.ToList();
var moviesSortedList = new List<int>();
foreach (var movie in moviesAndAverageGradeSortedList)
{
var key = movie.Key;
moviesSortedList.Add(key);
}
return moviesSortedList;
}
因此List<{int,double}>
由於.select方法List<{int,double}>
moviesAndAverageGradeSortedList
返回List<{int,double}>
。 因此,我無法返回此值,因為此方法是List<int>
類型,因為我只希望movieIds
而不是其平均成績。
因此,我創建了一個新的List<int>
,然后創建了foreach循環,遍歷了moviesAndAverageGradeSortedList
並僅保存了該列表中的鍵。
我認為此解決方案是不正確的,因為當我將大數字作為參數時,foreach循環可能會非常緩慢。 有人知道,如何從第一個列表中獲取“鍵”( movieIds
),從而避免創建另一個List<int>
和foreach循環?
我將為每一個解決方案而感激。
您可以通過在訂購后添加另一個.Select
來避免第二個列表的創建。 另外,為了使它更整潔,您可以:
return _deserializator.RatingCollection()
.GroupBy(i => i.Movie)
.OrderByDescending(g => g.Average(i => i.Grade))
.Select(g => g.Key)
.Take(amountOfMovies)
.ToList();
請注意,這並不能真正提高性能(如果有的話),因為即使在您的原始實現中,第二個列表的創建也僅在前n個項目的子集上完成。 昂貴的操作是按組的平均值進行排序,並且您想要對json文件中的所有項目執行操作,而不管您要返回的項目數量如何
您可以按平均順序訂購列表后添加另一個選擇
var moviesAndAverageGradeSortedList = _deserializator.RatingCollection()
.GroupBy(movieId => movieId.Movie)
.Select(group => new
{
Key = group.Key,
Average = group.Average(g => g.Grade)
})
.OrderByDescending(a => a.Average)
.Take(amountOfMovies)
.Select(s=> s.Key)
.ToList();
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.