Nhận tài sản giá trị trực tuyến trong IGrouping


141

Tôi có một cấu trúc dữ liệu như

public DespatchGroup(DateTime despatchDate, List<Products> products);

Và tôi đang cố gắng làm ...

var list = new List<DespatchGroup>();

foreach (var group in dc.GetDespatchedProducts().GroupBy(i => i.DespatchDate))
{
    // group.Values is not correct... how do I write this?
    list.Add(new DespatchGroup(group.Key, group.Values);
}

Tôi rõ ràng là không hiểu IGroupingvì tôi không thể thấy làm thế nào để thực sự có được các bản ghi dữ liệu trong nhóm!


1
Bản chỉnh sửa (Rev2) không mang tính xây dựng vì nó không khớp với bất kỳ câu trả lời nào.
Nắng Patel

Câu trả lời:


170

Nhóm thực hiện IEnumerable<T>- Trong trường hợp chung , chỉ cần gọi foreachqua group. Trong này trường hợp, vì bạn cần một List<T>:

list.Add(new DespatchGroup(group.Key, group.ToList());

Vì vậy, về cơ bản nếu chúng ta tuân theo bản chất của câu hỏi valuethì có thể so sánh với ToList()chỉ có nhiều chi phí ở đó để chuyển đổi nó thành một danh sách thay vì chỉ lấy ra một giá trị
Coops

2
@CodeBlend có nhiều chi phí hơn vì họ muốn có một danh sách. Nếu có một Valuestài sản như họ tưởng tượng thì họ phải làm group.Values.ToList(). Ngược lại nếu họ chấp nhận bất kỳ danh sách nào thay vì danh sách thì new DespatchGroup(group.Key, group)sẽ hoạt động. Chi phí hoạt động là từ định nghĩa DespachGroupkhông phải từ cách IGrouping hoạt động.
Jon Hanna

35

Không có Valuestài sản hoặc tương tự vì IGrouping<T>bản thân các IEnumerable<T>chuỗi giá trị. Tất cả những gì bạn cần làm trong trường hợp này là chuyển đổi chuỗi đó thành một danh sách:

list.Add(new DespatchGroup(group.Key, group.ToList());

6
Chúng tôi cũng có thể chuyển đổi thành IEnumerable nếu muốn : group.AsEnumerable().
Mateen Ulhaq

22

Đối với bất kỳ nhóm được chọn, bạn có thể gọi

var selectedGroupValues=selectedGroup.SelectMany(x=>x);

2
Cảm ơn! Không giống như .Selectcái nào sẽ trả về một IGrouping <> một lần nữa, .SelectManysẽ trả về một số lượng lớn các loại giá trị được nhóm lại, đó là những gì tôi đã theo sau.
K0D4

Tôi muốn nói chỉ sử dụng điều này khi có (có khả năng) nhiều nhóm được chọn. (còn gọi là IEnumerable<IGrouping<key,DespatchGroup>>). Nếu không, sử dụng toList(), hoặc đơn giản là đúc nó IEnumerable<DespatchGroup>.
táo táo

21

Chỉ là một mẹo có liên quan - vì, như các câu trả lời khác đã nói, việc phân nhóm là một IEnumerable, nếu bạn cần truy cập vào một chỉ mục cụ thể mà bạn có thể sử dụng group.ElementAt(i).

Điều này có thể rõ ràng với nhiều người nhưng hy vọng nó sẽ giúp được một số ít!

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.