2011-03-29 29 views
11

Bất kỳ ai biết cách tôi có thể đặt giá trị mặc định cho giá trị trung bình? Tôi có một dòng như thế này ...Phương pháp mở rộng trung bình trong LINQ cho giá trị mặc định

dbPlugins = (from p in dbPlugins 
       select new { Plugin = p, AvgScore = p.DbVersions.Average(x => x.DbRatings.Average(y => y.Score)) }) 
      .OrderByDescending(x => x.AvgScore) 
      .Select(x => x.Plugin).ToList(); 

mà ném một lỗi vì tôi chưa có xếp hạng. Nếu tôi không có tôi muốn trung bình để mặc định 0. Tôi đã suy nghĩ này nên là một phương pháp mở rộng, nơi tôi có thể xác định những gì giá trị mặc định nên được.

Trả lời

-1

Tôi đã thử một số câu trả lời nhưng cuối cùng lại nhận được nhiều ngoại lệ hơn vì một lý do nào đó. điều này đã kết thúc với tôi. Tôi chắc chắn buổi biểu diễn thật đáng sợ nhưng tôi sẽ sửa lại sau.

var q1 = from v in db.DbVersions select new { VersionId = v.Id, AvgScore = v.DbRatings.Average(x => x.Score) as Nullable<double> }; 
var q2 = from p in dbPlugins select new { Plugin = p, AvgScore = q1.Where(x => p.DbVersions.Select(y => y.Id).Contains(x.VersionId)).Average(x => x.AvgScore) as Nullable<double> }; 
dbPlugins = q2.OrderByDescending(x => x.AvgScore).Select(x => x.Plugin).ToList(); 
32

Có: DefaultIfEmpty.

Tôi không chắc chắn về những gì DbVersions của bạn và DbRatings đang có và đó bộ sưu tập chính xác có không mục, nhưng đây là ý tưởng:

var emptyCollection = new List<int>(); 
var average = emptyCollection.DefaultIfEmpty(0).Average(); 

Cập nhật: (lặp đi lặp lại những gì đã nói trong các ý kiến ​​dưới đây để tăng khả năng hiển thị)

Nếu bạn thấy mình cần sử dụng DefaultIfEmpty trên tập hợp loại lớp, hãy nhớ rằng bạn có thể thay đổi truy vấn LINQ thành dự án trước khi kết hợp. Ví dụ:

class Item 
{ 
    public int Value { get; set; } 
} 

var list = new List<Item>(); 
var avg = list.Average(item => item.Value); 

Nếu bạn không muốn/không thể xây dựng một mặc định Item với Value bằng 0, bạn có thể chiếu đến một bộ sưu tập của int s đầu tiên và sau đó cung cấp một mặc định:

var avg = list.Select(item => item.Value).DefaultIfEmpty(0).Average(); 
+0

@Jon: Nhưng bạn đã quay lại bắt đầu ngay bây giờ, 'x.DbRatings' có thể rỗng ở đây. 'p.DbVersions.Select (x => x.DbRatings) .DefaultIfEmpty (defaultRatings)', bạn cần phải xác định 'defaultRatings', nó không đơn giản là một số. –

0

tôi không nghĩ rằng có một cách để chọn mặc định, nhưng làm thế nào về truy vấn này

dbPlugins = (from p in dbPlugins 
      select new { 
       Plugin = p, AvgScore = 
        p.DbVersions.Any(x => x.DbRatings) ? 
         p.DbVersions.Average(x => x.DbRatings.Average(y => y.Score)) : 0 }) 
      .OrderByDescending(x => x.AvgScore) 
      .Select(x => x.Plugin).ToList(); 

Về cơ bản giống như của bạn, nhưng trước tiên chúng tôi hỏi xem có xếp hạng nào trước khi tính trung bình chúng hay không. Nếu không, chúng tôi trả lại 0.

Các vấn đề liên quan