簡體   English   中英

LINQ .select之后返回List &lt;{int,double}&gt;兩個值,但我需要List <int> 只有一個值

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM