2010-09-05 39 views
5

Tôi có một bảngSử dụng LINQ để đếm giá trị tần số

ID|VALUE 

GIÁ TRỊ là một trường số nguyên với giá trị có thể từ 0 đến 4. Làm thế nào tôi có thể truy vấn số lượng của mỗi giá trị?

Lý tưởng nhất là kết quả phải là một mảng có 6 phần tử, một cho số lượng của mỗi giá trị và giá trị cuối cùng là tổng số hàng.

Trả lời

16

chương trình đơn giản này không chỉ rằng:

class Record 
{ 
    public int Id { get; set; } 
    public int Value { get; set; } 
} 

class Program 
{ 
    static void Main(string[] args) 
    { 
     List<Record> records = new List<Record>() 
     { 
      new Record() { Id = 1, Value = 0}, 
      new Record() { Id = 2, Value = 1 }, 
      new Record() { Id = 3, Value = 2 }, 
      new Record() { Id = 4, Value = 3 }, 
      new Record() { Id = 5, Value = 4 }, 
      new Record() { Id = 6, Value = 2 }, 
      new Record() { Id = 7, Value = 3 }, 
      new Record() { Id = 8, Value = 1 }, 
      new Record() { Id = 9, Value = 0 }, 
      new Record() { Id = 10, Value = 4 } 
     }; 

     var query = from r in records 
        group r by r.Value into g 
        select new {Count = g.Count(), Value = g.Key}; 

     foreach (var v in query) 
     { 
      Console.WriteLine("Value = {0}, Count = {1}", v.Value, v.Count); 
     } 
    } 
} 

Output:

Value = 0, Count = 2 
Value = 1, Count = 2 
Value = 2, Count = 2 
Value = 3, Count = 2 
Value = 4, Count = 2 

phiên bản sửa đổi Hơi để trả lại một mảng với chỉ số lượng giá trị:

int[] valuesCounted = (from r in records 
         group r by r.Value 
         into g 
         select g.Count()).ToArray(); 

Thêm các hàng đếm vào cuối:

valuesCounted = valuesCounted.Concat(new[] { records.Count()}).ToArray(); 
3

Sau đây là cách bạn sẽ nhận được số lượng hàng cho mỗi giá trị của VALUE, theo thứ tự:

var counts = 
    from row in db.Table 
    group row by row.VALUE into rowsByValue 
    orderby rowsByValue.Key 
    select rowsByValue.Count(); 

Để có được tổng số hàng trong bảng, bạn có thể thêm tất cả các tội nhau. Bạn không muốn trình tự ban đầu được lặp lại hai lần, mặc dù; điều đó sẽ khiến truy vấn được thực hiện hai lần. Thay vào đó, bạn nên thực hiện một danh sách trung gian đầu tiên:

var countsList = counts.ToList(); 

var countsWithTotal = countsList.Concat(new[] { countsList.Sum() }); 
+1

hoặc tôi có thể thêm tất cả các tính không? tôi có thể sử dụng count.Sum()? – Rana

+0

Có, bạn cũng có thể làm điều đó. Tôi đã chỉnh sửa câu trả lời của mình để phản ánh nó. –

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