Chuyển đến nội dung chính

C# LINQ Grouping Data

Grouping trong LINQ cho phép bạn trả về nhiều nhóm dữ liệu từ một tập hợp dựa trên giá trị key được cung cấp
Trong bài viết này, mình sẽ hướng dẫn cách:
  • Group dữ liệu theo 1 khóa
  • Group dữ liệu theo nhiều khóa
  • Cách tính kết quả sau khi group dữ liệu

Grouping 1 khóa

Ví dụ:
var contacts = Contact.SampleData();
var q = contacts.GroupBy(c => c.State);
Kết quả trả về là một tập hợp gồm nhiều nhóm, mỗi nhóm có Key khác nhau.

Key được xác định thông qua biểu thức keySelector
public static IEnumerable<IGrouping<TKey, TSource>> GroupBy<TSource, TKey>(this IEnumerable<TSource> source, Func<TSource, TKey> keySelector);
Kết quả trả về có kiểu: IEnumerable<IGrouping<TKey, TSource>>
IGrouping<TKey, TSource> kết thừa từ interface IEnumerable<TElement> và đưa vào 1 thuộc Key đại diện cho nhóm grouping.
public interface IGrouping<TKey, TElmt> : IEnumerable<TElmt>
{
    TKey Key { get; }
}
Đây là cách để in ra dữ liệu từ IEnumerable<IGrouping<TKey, TSource>>
foreach (var group in q) 
{
 // Group specific code here 
 Console.WriteLine(“Group key: {0}”, group.Key);
 foreach (var element in group) 
 {
  // Element specific code here 
  Console.WriteLine(“ - {0}”, element);
 } 
}

Grouping theo nhiều khóa

Ví dụ:
var q = contacts.GroupBy(c => new { c.LastName, c.State});
// var q = from c in contacts
// group c by new LastNameState { LastName = c.LastName, State = c.State };

Tính toán kết quả trên tập hợp

Để tính toán kết quả sau khi group, bạn sử dụng câu lệnh into (LinQ to SQL) để tiếp tục truy vấn dựa vào kết quả sau khi group by.
    var q = from c in calls
      group c by c.Number into g
      select new
      {
         Number = g.Key,
         InCalls = g.Count(c => c.Incoming),
         OutCalls = g.Count(c => !c.Incoming),
         TotalTime = g.Sum(c => c.Duration),
         AvgTime = g.Average(c => c.Duration)
      }; 
Với biểu thức Lambda, ta có:
 var q = calls.GroupBy(t => t.Number).Select(g => new
            {
                Number = g.Key,
                InCalls = g.Count(c => c.Incoming),
                OutCalls = g.Count(c => !c.Incoming),
                TotalTime = g.Sum(c => c.Duration),
                AvgTime = g.Average(c => c.Duration)
            });
Kết quả:

Download source code: MediaFire
Chúc các bạn thành công!
Nhatkyhoctap's blog
Tham khảo:
  • LINQ to Objects Using C# 4.0

Nhận xét

  1. According to the GroupBy documentation:

    The default equality comparer Default is used to compare keys.

    For anonymous types, the default equality comparer uses a property-by-property comparison, so any two anonymous types with the same members and values will be considered equivalent.

    For concrete types, the default equality comparer uses reference comparison, so any two instances of the object are always considered inequivalent, regardless of their values.

    To make GroupBy work with your GroupingKey class, you can either use the overload that takes an IEqualityComparer to define comparisons, or override Object.Equals in GroupingKey to perform the desired comparison.

    Trả lờiXóa

Đăng nhận xét

Bài đăng phổ biến từ blog này

[ASP.NET MVC] Authentication và Authorize

Một trong những vấn đề bảo mật cơ bản nhất là đảm bảo những người dùng hợp lệ truy cập vào hệ thống. ASP.NET đưa ra 2 khái niệm: Authentication và Authorize Authentication xác nhận bạn là ai. Ví dụ: Bạn có thể đăng nhập vào hệ thống bằng username và password hoặc bằng ssh. Authorization xác nhận những gì bạn có thể làm. Ví dụ: Bạn được phép truy cập vào website, đăng thông tin lên diễn đàn nhưng bạn không được phép truy cập vào trang mod và admin.

ASP.NET MVC: Cơ bản về Validation

Validation (chứng thực) là một tính năng quan trọng trong ASP.NET MVC và được phát triển trong một thời gian dài. Validation vắng mặt trong phiên bản đầu tiên của asp.net mvc và thật khó để tích hợp 1 framework validation của một bên thứ 3 vì không có khả năng mở rộng. ASP.NET MVC2 đã hỗ trợ framework validation do Microsoft phát triển, tên là Data Annotations. Và trong phiên bản 3, framework validation đã hỗ trợ tốt hơn việc xác thực phía máy khách, và đây là một xu hướng của việc phát triển ứng dụng web ngày nay.

Tổng hợp một số kiến thức lập trình về Amibroker

Giới thiệu về Amibroker Amibroker theo developer Tomasz Janeczko được xây dựng dựa trên ngôn ngữ C. Vì vậy bộ code Amibroker Formula Language sử dụng có syntax khá tương đồng với C, ví dụ như câu lệnh #include để import hay cách gói các object, hàm trong các block {} và kết thúc câu lệnh bằng dấu “;”. AFL trong Amibroker là ngôn ngữ xử lý mảng (an array processing language). Nó hoạt động dựa trên các mảng (các dòng/vector) số liệu, khá giống với cách hoạt động của spreadsheet trên excel.