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!

fearofawhackplanet
sumber
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());
Marc Gravell
sumber
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());
LukeH
sumber
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);
Bassl Kokash
sumber
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!

Rob H.
sumber