2015-03-31 178 views
1

我正在創建一個方法,該方法將獲得最高平均評級的業務對象列表。該方法以商業清單開始。每個業務都包含一個包含評級(int)的評論對象列表。如何使用linq獲取列表中列表的平均值?

舉例說明:

list<Review> reviews = curtBusiness.getReviews(); 
reviews[1].GetRating(); 

使用for循環,我可以很容易地找到它,然而不幸的是,我需要使用LINQ,東西我幾乎沒有任何技能。

任何人都可以幫我做這個查詢或類似的查詢LINQ語句?

更新:

我想我可能已經偶然到一個解決方案

double average = busInCat.Max(b=> b.GetReviews().Average(r => r.getRateing())); 
     return busInCat.Where(b => b.GetReviews().Average(r => r.getRateing()) == average).ToList(); 

如果上面的代碼是正確的,那麼它首先找到收視率的最高平均在第一線。

然後在第二行中返回具有該平均評級的企業列表。任何人都可以證實這是linq表達式在做什麼?

+0

small nit-pick:'getRateing'應該拼寫成'getRating',並且由於它是一種方法,所以應該是PascalCase:'GetRating' ... – 2015-03-31 22:15:31

+0

不用擔心我的拼寫是令人遺憾的。 – Noob 2015-03-31 22:16:35

回答

0

我已經測試我把更新的解決方案:

double average = busInCat.Max(b=> b.GetReviews().Average(r => r.getRateing())); 
return busInCat.Where(b => b.GetReviews().Average(r => r.getRateing()) == average).T 

如預期上面的代碼確實工作。

0

您可以使用LINQ語句來提取評級的列表中,然後調用這個名單上的Average功能:

var average = (
    from r in reviews 
    select r.getRateing() 
    ).Average(); 
1

我不太明白你在找什麼在這裏,但我我會猜測。

你有一個Review對象,有像int getRating()的方法,你有這些對象的列表,你想找到的收視率

像這樣的平均會做的伎倆

// get your reviews 
var reviews = curtBusiness.getReviews(); 

// get the average of the getRating() results of the reviews 
var average = reviews.Average(r => r.getRating()); 

這是你在找什麼?我可以提供進一步的解釋,但我想確定這就是你要做的。

+0

對不起,模糊不清。我已經用我認爲是解決方案的問題更新了這個問題。如果是的話,它應該闡明我正在努力做的事情。 – Noob 2015-03-31 22:13:34

1

有一種方法在一個語句來做到這一點:

busInCat.Select(b => new { b, Avg = b.GetReviews().Average(r => r.GetRating()) }) 
     .GroupBy(x => x.Avg, x => x.b) 
     .OrderByDescending(g => g.Key) 
     .FirstOrDefault(); 

此先建立一個企業和他們的平均名單。然後它按照平均值進行分組,按照它們的密鑰的降序(平均值)對組進行排序並獲取第一組。該組是IEnumerable<Business>,即平均數最高的企業。