Thứ hai, ngày 5 tháng 12 năm 2016

LINQ – Sử dụng Group By

Ngày đăng: 19/3/2012, 12:49:37AM | Lượt xem: 4,248
Hot!

Là một toán tử deffered, GroupBy có chức năng gom nhóm dữ liệu theo một hoặc một nhóm điều kiện được gọi là key. Mỗi nhóm dữ liệu này được chứa trong một đối tượng kiểu IGrouping< TKey, TElement>.

Là một toán tử deffered, GroupBy có chức năng gom nhóm dữ liệu theo một hoặc một nhóm điều kiện được gọi là key. Mỗi nhóm dữ liệu này được chứa trong một đối tượng kiểu IGrouping< TKey, TElement>.

Extension method Enumerable.GroupBy() có nhiều overload, đơn giản nhất là:

public static IEnumerable<IGrouping<TKey, TSource>> GroupBy<TSource, TKey>(
        this IEnumerable<TSource> source,
        Func<TSource, TKey> keySelector
)

Phương thức GroupBy() dựa vào một đối tượng IEqualityComparer<TKey> để so sánh các key với nhau, trong overload trên vì ta không xác định rõ đối tượng dùng để so sánh, GroupBy() sẽ sử dụng đối tượng mặc định EqualityComparer<T>.Default.

Một overload khác của GroupBy() cho phép bạn truyền một custom comparer  vào để so sánh:

public static IEnumerable<IGrouping<TKey, TSource>> GroupBy<TSource, TKey>(
        this IEnumerable<TSource> source,
        Func<TSource, TKey> keySelector,
        IEqualityComparer<TKey> comparer
)

Tạo dữ liệu mẫu

Khai báo lớp:

class Product
{
	public int CategoryID;
	public int Price;
	public string ProductName;

}
class Category
{
	public int CategoryID;
	public string CategoryName;

	public Category(int id, string name)
	{
		this.CategoryID=id;
		this.CategoryName=name;
	}
}

Tạo dữ liệu mẫu:

var products=new Product[]{
	new Product() { CategoryID=100, Price=50, ProductName="Kaspersky"},
	new Product() { CategoryID=100, Price=40, ProductName="Norton AV"},
	new Product() { CategoryID=100, Price=30, ProductName="Bitdefender"},
	new Product() { CategoryID=101, Price=30, ProductName="WinZip"},
	new Product() { CategoryID=101, Price=40, ProductName="TuneUp"},
	new Product() { CategoryID=102, Price=40, ProductName="Yozo Office"},
	new Product() { CategoryID=102, Price=50, ProductName="Kingsoft Office"},

};

var categories=new Category[]{
	new Category(100,"Antivirus"),
	new Category(101,"Utilities"),
	new Category(102,"Office")
};

Một vài ví dụ cơ bản

Sử dụng một biểu thức boolean để so sánh ta sẽ được hai giá trị của key là true và false, mỗi giá trị tương ứng với một nhóm:

Query Syntax:

var x=from p in products
	group p by p.Price<=40;

Method Syntax:

var x=products.GroupBy(p => p.Price<=40);

Kết quả:

IEnumerable<IGrouping<Boolean,Product>> (2 items)
Key= False
IGrouping<Boolean,Product> (2 items)
CategoryID Price ProductName

100

50

Kaspersky

102

50

Kingsoft Office
Key= True
IGrouping<Boolean,Product> (5 items)
CategoryID Price ProductName

100

40

Norton AV

100

30

Bitdefender

101

30

WinZip

101

40

TuneUp

102

40

Yozo Office

Nếu muốn thực hiện một vài thao tác trên mỗi nhóm, bạn có thể sử dụng từ khóa into để tạo một định danh cho nhóm.  Đối tượng được định danh cho nhóm này có kiểu IGrouping<TKey, TElement>, vì vậy bạn có thể dùng property Key để lấy giá trị key của nhóm.

Ví dụ sau cho phép ta gom nhóm sản phầm theo Category và lọc đi nhóm có CategoryID là 101:

Query Syntax:

var x=from p in products
	group p by p.CategoryID into g
	where g.Key !=101
	select g;

Method Syntax:

var x=products.GroupBy(p => p.CategoryID).Where(g => g.Key!=101);

Kết quả:

IEnumerable<IGrouping<Int32,Product>> (2 items)
Key= 100
IGrouping<Int32,Product> (3 items)
CategoryID Price ProductName

100

50

Kaspersky

100

40

Norton AV

100

30

Bitdefender

120

Key= 102
IGrouping<Int32,Product> (2 items)
CategoryID Price ProductName

102

40

Yozo Office

102

50

Kingsoft Office

90

Sử dụng subquery, bạn có thể thực hiện truy vấn trên mỗi nhóm và lấy ra kiểu dữ liệu cần thiết:

Query Syntax:

var x=from p in products
group p by p.Price into g
select new
{
	Price=g.Key,
	ProductName=(from gg in g
		select gg.ProductName)
};

Method Syntax:

var x=products.GroupBy (p => p.Price)
   	.Select ( g =>  new
				{
					Price = g.Key,
					ProductName = g.Select (gg => gg.ProductName)
				});

Kết quả:

IEnumerable<> (3 items)
PriceΞΞ ProductName

50

IEnumerable<String> (2 items)
Kaspersky
Kingsoft Office

40

IEnumerable<String> (3 items)
Norton AV
TuneUp
Yozo Office

30

IEnumerable<String> (2 items)
Bitdefender
WinZip

http://yinyangit.wordpress.com

 Chia sẻ qua: 
Hot!
Ý kiến bạn đọc

These items will be permanently deleted and cannot be recovered. Are you sure?

Gallery

image

Maecenas viverra rutrum pulvinar

Maecenas viverra rutrum pulvinar! Aenean vehicula nulla sit amet metus aliquam et malesuada risus aliquet. Vestibulum rhoncus, dolor sit amet venenatis porta, metus purus sagittis nisl, sodales volutpat elit lorem…

Read more

Text Links

Thiết kế logo chuyên nghiệp Insky
DAFABET
W88 w88b.com/dang-ky-tai-khoan-w88
W88
Copyright © 2011 - 2012 vietshare.vn by phamkhuong102@gmail.com doanhkisi2315@gmail.com. All rights reserved.