Linq - เข้าร่วมผ่านพจนานุกรมโดยที่ KeyValuePair.Value เป็นคอลเล็กชันของตัวเอง

พยายามทำความเข้าใจว่าการรวมควรมีลักษณะอย่างไรตามตัวอย่างด้านล่าง ความช่วยเหลือใด ๆ ในการพิจารณาว่าเป็นไปได้หรือไม่ที่จะเขียน linq สำหรับสิ่งต่อไปนี้จะได้รับการชื่นชมอย่างมาก!

        List<string> col1;
        Dictionary<string, List<string>> join2;

ฉันต้องการเลือกคีย์ทั้งหมดจากพจนานุกรมที่มีรายการใน col1 อยู่ในคอลเลกชันรายการค่าของพจนานุกรม

        IEnumerable<string> query = from c1 in col1
                                    join kvp in join2 on c1 equals kvp.Value
                                    where c1 == "foo"
                                    orderby kvp.Key
                                    select kvp.Key;

เห็นได้ชัดว่าข้างต้นล้มเหลวเนื่องจาก kvp.Value เป็นรายการและไม่ใช่สตริงที่จะเท่ากับ c1 - มีพอยน์เตอร์ใดบ้าง


person Matt S    schedule 19.07.2011    source แหล่งที่มา
comment
รายการ ทั้งหมด ใน col1 ปรากฏในค่าโดยที่ใด โดยที่รายการ ใดๆ ใน col1 ปรากฏในค่าโดยที่ใด การสั่งซื้อนั้นสำคัญไฉน? ฟูเข้ามาไหน? ยังไม่ชัดเจนว่าคุณกำลังพยายามบรรลุผลอะไรในขณะนี้ กรุณาให้ข้อมูลตัวอย่างบางส่วน   -  person Jon Skeet    schedule 19.07.2011
comment
สวัสดีจอน ฉันต้องการเชื่อมโยงผ่านคอลเลกชันในคุณสมบัติ Value ของ KeyValuePair เพื่อส่งคืนคีย์ ส่วน 'foo' แบบมีเงื่อนไขแสดงถึงค่าที่ฉันต้องการค้นหาในคอลเลกชันค่าเพื่อส่งคืนคีย์ ฉันอยู่หลังการจับคู่ ใดๆ - ดังนั้นผลคูณจากอนุประโยคและเงื่อนไขการใช้ a บรรจุจึงตรงกับข้อกำหนดของฉัน ขอบคุณที่มองหา   -  person Matt S    schedule 19.07.2011
comment
การใช้การโทรใด ๆ ก็ใช้ได้ผลเช่นกัน ...   -  person Jon Skeet    schedule 19.07.2011


คำตอบ (1)


ฉันไม่แน่ใจว่าทำไมจึงต้องเข้าร่วม ... หากคุณเลือก "foo" สิ่งต่อไปนี้จะให้ผลลัพธ์เดียวกัน:

        IEnumerable<string> query = from kvp in join2
                                where kvp.Value.Contains ("foo")
                                orderby kvp.Key
                                select kvp.Key;

อีกทางเลือกหนึ่งด้วยการเข้าร่วม

        IEnumerable<string> query = from c1 in col1 where c1 == "foo" from kvp in join2 
                                where kvp.Value.Contains (c1) 
                                orderby kvp.Key
                                select kvp.Key;
person Yahia    schedule 19.07.2011
comment
ขอบคุณ นั่นคือสิ่งที่ฉันต้องการ มันเป็นตัวอย่างง่ายๆ เหตุผลที่ซับซ้อนจริงๆ สมเหตุสมผลมากกว่าในกรณีทางธุรกิจของฉัน ไม่ทราบว่าเป็นไปได้หลายรายการ ตอนนี้สมเหตุสมผลแล้ว ขอบคุณ!!! - person Matt S; 19.07.2011