Dapatkan properti "Nilai" dalam Pengelompokan


143

Saya memiliki struktur data seperti

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

Dan saya mencoba melakukan ...

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);
}

Saya jelas tidak mengerti IGroupingkarena saya tidak bisa melihat bagaimana sebenarnya mendapatkan catatan data di dalam grup!


1
Suntingan (Rev2) tidak terlalu konstruktif karena tidak cocok dengan jawaban mana pun.
Sunny Patel

Jawaban:


175

-Alat Kelompok IEnumerable<T>- Dalam umum kasus, sebut saja foreachselama group. Dalam hal ini, karena Anda membutuhkan List<T>:

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

Jadi pada dasarnya jika kita mengikuti esensi dari pertanyaan valueini sebanding dengan ToList()hanya ada lebih banyak overhead di sana untuk mengubahnya menjadi daftar daripada hanya mengeluarkan nilai
Coops

2
@CodeBlend ada lebih banyak overhead karena mereka menginginkan daftar. Jika ada Valuesproperti seperti yang mereka bayangkan maka mereka harus melakukannya group.Values.ToList(). Sebaliknya jika mereka menerima enumerable apapun daripada daftar maka new DespatchGroup(group.Key, group)akan berhasil. Overhead berasal dari definisi DespachGroupbukan dari cara kerja IGrouping.
Jon Hanna

36

Tidak ada Valuesproperti atau serupa karena IGrouping<T>itu sendiri adalah yang IEnumerable<T>urutan nilai. Yang perlu Anda lakukan dalam hal ini adalah mengubah urutan itu menjadi daftar:

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

7
Kami juga dapat mengkonversi ke IEnumerable jika kita ingin: group.AsEnumerable().
Mateen Ulhaq

23

Untuk setiap grup yang dipilih, Anda dapat menelepon

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

2
Terima kasih! Tidak seperti .Selectyang akan mengembalikan IGrouping <> lagi, .SelectManyakan mengembalikan IEnumerable dari tipe nilai yang dikelompokkan, yang merupakan apa yang saya cari.
K0D4

Saya akan mengatakan hanya gunakan ini ketika ada (berpotensi) beberapa grup yang dipilih. (alias IEnumerable<IGrouping<key,DespatchGroup>>). Jika tidak, gunakan toList(), atau cukup transmisikan ke IEnumerable<DespatchGroup>.
apel apel

21

Hanya tip terkait - karena, seperti yang dikatakan jawaban lain, pengelompokan adalah IEnumerable, jika Anda perlu mengakses indeks tertentu yang dapat Anda gunakan group.ElementAt(i).

Ini mungkin sudah jelas bagi banyak orang, tetapi semoga dapat membantu beberapa!

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.