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:
Key được xác định thông qua biểu thức keySelector
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.
Download source code: MediaFire
Chúc các bạn thành công!
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
According to the GroupBy documentation:
Trả lờiXóaThe 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.