GroupBy
và ToLookUp
có gần như cùng một chức năng TRỪ này: Reference
GroupBy: Toán tử GroupBy trả về các nhóm phần tử dựa trên một số giá trị khóa. Mỗi nhóm được đại diện bởi đối tượng IGrouping.
ToLookup: ToLookup cũng giống như GroupBy; sự khác biệt duy nhất là việc thực thi GroupBy bị hoãn lại trong khi việc thực thi ToLookup là ngay lập tức.
Hãy xóa sự khác biệt bằng cách sử dụng mã mẫu. giả sử rằng chúng ta có một Person
mô hình đại diện cho lớp :
class Personnel
{
public int Id { get; set; }
public string FullName { get; set; }
public int Level { get; set; }
}
sau đó, chúng tôi xác định một danh sách personnels
như sau:
var personnels = new List<Personnel>
{
new Personnel { Id = 1, FullName = "P1", Level = 1 },
new Personnel { Id = 2, FullName = "P2", Level = 2 },
new Personnel { Id = 3, FullName = "P3", Level = 1 },
new Personnel { Id = 4, FullName = "P4", Level = 1 },
new Personnel { Id = 5, FullName = "P5", Level =2 },
new Personnel { Id = 6, FullName = "P6", Level = 2 },
new Personnel { Id = 7, FullName = "P7", Level = 2 }
};
Bây giờ tôi cần personnels
nhóm theo cấp độ của họ. Tôi có hai cách tiếp cận ở đây. sử dụng GroupBy
hoặc ToLookUp
. Nếu tôi sử dụng GroupBy
, như đã nêu trước đây, nó sẽ sử dụng thực thi hoãn lại, điều này có nghĩa là khi bạn lặp lại qua bộ sưu tập, mục tiếp theo có thể được tính hoặc không cho đến khi nó được gọi.
var groups = personnels.GroupBy(p => p.Level);
personnels.RemoveAll(p => p.Level == 1);
foreach (var product in groups)
{
Console.WriteLine(product.Key);
foreach (var item in product)
Console.WriteLine(item.Id + " >>> " + item.FullName + " >>> " + item.Level);
}
Trong đoạn mã trên, trước tiên tôi đã nhóm lại personnels
, nhưng trước khi lặp lại, tôi đã loại bỏ một số personnels
. Vì GroupBy
sử dụng thực thi hoãn lại, do đó, kết quả cuối cùng sẽ không bao gồm các mục bị loại bỏ, bởi vì việc nhóm sẽ được tính toán ở foreach
điểm ở đây.
Đầu ra:
2
2 >>> P2 >>> 2
5 >>> P5 >>> 2
6 >>> P6 >>> 2
7 >>> P7 >>> 2
Nhưng nếu tôi viết lại mã trên như bên dưới: (lưu ý rằng mã giống với mã trước đó ngoại trừ GroupBy
được thay thế bằng ToLookUp
)
var groups = personnels.ToLookup(p => p.Level);
personnels.RemoveAll(p => p.Level == 1);
foreach (var product in groups)
{
Console.WriteLine(product.Key);
foreach (var item in product)
Console.WriteLine(item.Id + " >>> " + item.FullName + " >>> " + item.Level);
}
Vì ToLookUp
sử dụng thực thi ngay lập tức, điều đó có nghĩa là khi tôi gọi ToLookUp
phương thức, kết quả sẽ được tạo và áp dụng nhóm, vì vậy nếu tôi xóa bất kỳ mục nào khỏi personnels
lần lặp lại, điều đó sẽ không ảnh hưởng đến kết quả cuối cùng.
Đầu ra:
1
1 >>> P1 >>> 1
3 >>> P3 >>> 1
4 >>> P4 >>> 1
2
2 >>> P2 >>> 2
5 >>> P5 >>> 2
6 >>> P6 >>> 2
7 >>> P7 >>> 2
Lưu ý: GroupBy
và ToLookUp
cả hai cũng trả về các kiểu khác nhau.
Bạn có thể sử dụng ToDictionary thay vì ToLookUp, nhưng bạn cần chú ý điều này :( tham khảo )
Việc sử dụng ToLookup () rất giống với ToDictionary (), cả hai đều cho phép bạn chỉ định bộ chọn khóa, bộ chọn giá trị và bộ so sánh. Sự khác biệt chính là ToLookup () cho phép (và mong đợi) các khóa trùng lặp trong khi ToDictionary () thì không