รับคุณสมบัติ "มูลค่า" ในการจัดกลุ่ม IGG


141

ฉันมีโครงสร้างข้อมูลเช่น

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

และฉันพยายามทำ ...

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

เห็นได้ชัดว่าฉันไม่เข้าใจIGroupingเพราะฉันไม่สามารถเห็นวิธีการบันทึกข้อมูลภายในกลุ่มได้!


1
การแก้ไข(Rev2)ไม่ค่อยสร้างสรรค์เนื่องจากไม่ตรงกับคำตอบใด ๆ
Sunny Patel

คำตอบ:


170

กลุ่มการดำเนินการIEnumerable<T>- ในทั่วไปกรณีเพียงโทรมากกว่าforeach groupในกรณีนี้เนื่องจากคุณต้องการList<T>:

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

ดังนั้นโดยทั่วไปถ้าเรากำลังติดตามแก่นแท้ของคำถามvalueนั้นเทียบได้กับToList()มันมีค่าใช้จ่ายมากกว่าที่จะแปลงเป็นรายการซึ่งตรงข้ามกับการดึงค่าออกมา
Coops

2
@CodeBlend มีค่าใช้จ่ายมากขึ้นเพราะพวกเขาต้องการรายการ ถ้ามีคุณสมบัติเหมือนพวกเขาคิดแล้วพวกเขาก็จะต้องทำValues group.Values.ToList()ในทางกลับกันหากพวกเขายอมรับการแจกแจงแทนที่จะเป็นรายการก็new DespatchGroup(group.Key, group)จะใช้งานได้ ค่าโสหุ้ยมาจากคำจำกัดความที่DespachGroupไม่ได้มาจากวิธีการทำงานของ IGrouping
Jon Hanna

35

ไม่มีเป็นValuesทรัพย์สินหรือคล้ายกันเพราะIGrouping<T>ตัวเองเป็นIEnumerable<T>ลำดับของค่า สิ่งที่คุณต้องทำในกรณีนี้คือแปลงลำดับนั้นเป็นรายการ:

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

6
นอกจากนี้เรายังอาจแปลงไปยัง IEnumerable group.AsEnumerable()ถ้าเราต้องการ:
Mateen Ulhaq

22

สำหรับกลุ่มที่เลือกคุณสามารถโทร

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

2
ขอบคุณ! ไม่เหมือนกับ.Selectที่จะคืนค่า IGrouping <> อีกครั้ง.SelectManyจะส่งคืน IEnumerable ของประเภทค่า groupped ซึ่งเป็นสิ่งที่ฉันเป็นหลังจากนั้น
K0D4

ฉันจะบอกว่าใช้สิ่งนี้ก็ต่อเมื่อมีการเลือก (อาจ) หลายกลุ่ม (aka IEnumerable<IGrouping<key,DespatchGroup>>) มิฉะนั้นการใช้งานหรือเพียงแค่โยนมันทิ้งไปtoList() IEnumerable<DespatchGroup>
apple apple

21

เพียงแค่ปลายที่เกี่ยวข้องกัน - เนื่องจากเป็นคำตอบอื่น ๆ ได้กล่าวว่าการจัดกลุ่มเป็น IEnumerable group.ElementAt(i)ถ้าคุณจำเป็นต้องเข้าถึงดัชนีเฉพาะที่คุณสามารถใช้

นี่อาจเห็นได้ชัดสำหรับผู้คนจำนวนมาก แต่หวังว่ามันจะช่วยได้ไม่กี่คน!

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.