LINQ สร้างโดเมนปัญหาอะไร


12

ทุกครั้งที่ฉันเห็นคำถามที่โพสต์บน Stack Overflow ใน C # ฉันเห็นคำตอบอย่างน้อยหนึ่งหรือสองโพสต์ที่แก้ปัญหาด้วย LINQ โดยปกติคนที่มีชื่อเสียงสูงมากมักใช้ LINQ อย่างมืออาชีพ

ดังนั้นคำถามของฉันคือโดเมนปัญหาที่ควรจะใช้คือ LINQ

หมายเหตุด้านข้าง: มีจุดประสงค์ใดที่ควรหลีกเลี่ยงหรือไม่? ขนาดของชุดข้อมูลมีผลต่อประสิทธิภาพของการสืบค้น LINQ หรือไม่


2
เริ่มที่นี่: code.msdn.microsoft.com/101-LINQ-Samples-3fb9811b
Oded

จากนั้นไปที่นี่: msmvps.com/blogs/jon_skeet/archive/tags/Edulinq/default.aspx
Oded

1
LINQ สำหรับการสอบถามกราฟวัตถุ มันเป็น Language INtegrated Query - ช่วยให้คุณสามารถสืบค้นและจัดการกับคอลเลกชัน
Oded

1
อาจเป็นคำถามที่ปิดได้เนื่องจากอาจมีคำถามที่ดีที่แฝงตัวอยู่ในสิ่งที่ปัญหาของ linq เหมาะสำหรับแม้ว่า
jk

1
Linq เป็นการประกาศ คุณระบุว่า "อะไร" ที่คุณต้องการโดยไม่ระบุ "วิธี" ที่ทำได้ สำหรับ linq ซึ่งหมายความว่าคุณสามารถใช้แบบสอบถามเพื่อระบุสิ่งที่คุณต้องการ รหัสการประกาศอาจสั้นและง่ายต่อการเข้าใจปัญหาบางอย่าง
mike30

คำตอบ:


16

LINQ ได้รับการออกแบบมาเป็นหลักเพื่อให้การสืบค้นและการแปลงบริสุทธิ์ตามลำดับของข้อมูลเป็นหลัก (คุณจะสังเกตเห็นว่าส่วนขยาย LINQ ทั้งหมดใช้ผู้รับมอบสิทธิ์ Func แต่ไม่ใช่ตัวแทนผู้รับมอบอำนาจ) ดังนั้นกรณีที่พบบ่อยที่สุดของลูปที่ไม่เหมาะสมกับ LINQ เป็นอย่างดีคือสิ่งที่เกี่ยวกับผลข้างเคียงจากการใช้งานที่ไม่บริสุทธิ์เช่น

foreach(var x in list) Console.WriteLine(x);

หากต้องการใช้ LINQ ให้ดีขึ้นให้ลองใช้มันดู

ทุกครั้งที่คุณกำลังเขียนforหรือforeachวนรอบเพื่อทำบางสิ่งบางอย่างกับคอลเลกชันให้หยุดพิจารณาว่ามันเหมาะสมกับ LINQ หรือไม่เช่นการกระทำหรือผลข้างเคียงต่อองค์ประกอบต่างๆและถ้าบังคับให้คุณเขียน มันใช้ LINQ

คุณสามารถเขียนforeachเวอร์ชันก่อนจากนั้นเขียนเป็นเวอร์ชัน LINQ อีกครั้ง

เมื่อ svick ชี้ให้เห็น LINQ ควรจะทำให้โปรแกรมของคุณอ่านง่ายขึ้น โดยปกติแล้วจะดีเมื่อมีแนวโน้มที่จะเน้นถึงเจตนาของรหัสมากกว่ากลไก อย่างไรก็ตามหากคุณพบว่าคุณไม่สามารถทำให้ข้อความค้นหาของคุณอ่านง่ายกว่าลูปแบบง่าย ๆ คุณสามารถติดกับลูปได้

หากคุณต้องการการออกกำลังกายเพื่อการปฏิบัติมากที่สุดการออกกำลังกายโปรแกรมการทำงานจะแมไว้อย่างสวยงามเพื่อ LINQ เช่น99 ปัญหา (โดยเฉพาะคนแรกที่ 20 หรือดังนั้น) หรือออยเลอร์โครงการ


ฉันอาจต้องลบคำถามนี้ตอนนี้ ผู้ดำเนินรายการให้ความเห็นว่ามันไม่เหมาะกับชุมชน .. หากคุณรู้สึกอย่างอื่นโปรดบอกฉัน
user1816120

1
ฉันจะเพิ่มว่าถ้าคุณเขียนมันลงใน LINQ และต้นฉบับยังคงสามารถอ่านได้มากขึ้นให้เก็บต้นฉบับและลบรุ่น LINQ บางครั้ง LINQ ไม่ได้เพิ่มอะไรเลย
svick

@svick ในทฤษฎีใช่ฉันไม่แน่ใจว่าฉันสามารถคิดตัวอย่างใด ๆ ของเรื่องนี้แม้ว่า;)
jk

1
@jk ยกตัวอย่างเช่น ReSharper Aggregate()บางครั้งข้อเสนอที่จะแปลงห่วงของฉันที่จะใช้ ฉันคิดว่าส่วนใหญ่เวลาวนรอบสามารถอ่านได้มากขึ้น
svick

@svick อาจเป็นปัญหาของสิ่งที่คุณคุ้นเคยแม้ว่าฉันจะยอมรับว่าการรวมเป็นชื่อเงอะงะสำหรับ fold
jk

1

ในการตอบคำถามที่แก้ไข: ในระยะสั้นจะเป็นประโยชน์ในการใช้งาน LINQ ทุกครั้งที่คุณต้องใช้ฟังก์ชั่น "แบบสอบถาม" (นั่นคือสิ่งที่ Q ใน LINQ หมายถึง) การกำหนดโดเมนที่แน่นอนนั้นเป็นเรื่องยาก แต่ก็ช่วยลดความซับซ้อนของงานที่เกี่ยวข้องกับการแยกและจัดการข้อมูลจากคอลเลกชัน

เพื่ออธิบายรายละเอียดเล็กน้อยฟังก์ชั่นการสืบค้นจำนวนมากได้ถูกนำมาใช้โดยตรงกับภาษา (หรือมากกว่านั้นคือ LINQ-implementors ต่าง ๆ ) ดังนั้นสิ่งต่าง ๆ เช่นการรวมการเรียงลำดับการจัดกลุ่มการกรองการฉายเข้าร่วม (และอีกมากมาย) ล้วนได้รับการจัดการ คุณ. โดยทั่วไปแล้วโซลูชั่นที่ใช้ LINQ จะสั้นกว่าถ้าคุณใช้ "ด้วยมือ" และสื่อสารถึงเจตนาของพวกเขาได้ดียิ่งขึ้น

ตัวอย่างง่ายๆที่มักช่วยถ่ายทอดพลังของ LINQ คือการแสดงเนื้อหาของไดเรกทอรีจัดกลุ่มตามส่วนขยาย ดำเนินการผ่านการดำเนินการตามความจำเป็นทั่วไปในหัวของคุณ - จะมีรายละเอียดการใช้งานมากมายตั้งแต่เริ่มแรก บางทีเราจะใช้ a Dictionary<String, List<String>>เพื่อจัดทำดัชนีไฟล์ตามส่วนขยาย แน่นอนว่าเราจะต้องตรวจสอบว่ามีกุญแจอยู่แล้วยกตัวอย่างรายการเพิ่มเข้าไป ฯลฯ อาจเป็นไปดังนี้:

Dictionary<string, List<string>> fileGroups = new Dictionary<string, List<string>>();

foreach (string file in Directory.GetFiles(Environment.CurrentDirectory))
{
    string extension = Path.GetExtension(file).ToLower();

    if (!fileGroups.ContainsKey(extension))
    {
        fileGroups[extension] = new List<string>();
    }

    fileGroups[extension].Add(file);
}

พิจารณา LINQ ที่เทียบเท่า:

var query = from file in Directory.GetFiles(Environment.CurrentDirectory)
            group file by Path.GetExtension(file).ToLower();

โปรดสังเกตว่าข้อความค้นหานั้นมีเพียง 2 บรรทัดซึ่งสั้นกว่าโซลูชันที่จำเป็นใด ๆ ที่เราคิดไว้ นอกจากนี้ยังสามารถอ่านได้สวย; อัตราส่วนสัญญาณต่อเสียงรบกวนจะสูงกว่าเมื่อใช้โซลูชันแรก สำหรับผู้ที่ยังใหม่กับ LINQ คุณจะต้องแสดงผลลัพธ์ของการสืบค้นดังนี้:

foreach (var fileGroup in query)
{
    Console.WriteLine(String.Format("*** Files with extension: {0}", group.Key));

    foreach (string file in fileGroup)
    {
        Console.WriteLine(file);
    }
}

ด้วยตัวอย่างที่ซับซ้อนมากขึ้นความแตกต่างก็จะยิ่งมากขึ้นตามปกติ (ลองพิจารณาการจัดกลุ่มตามเขตข้อมูลหลาย ๆ ตัวอย่าง) ดังนั้นเพื่อสรุป LINQ สามารถแก้ปัญหาการสืบค้นข้อมูลแบบวันต่อวันได้หลายวิธีซึ่งมักจะสั้นกว่าและอธิบายตัวเองได้มากกว่า สิ่งนี้มีค่าใช้จ่ายเพียงเล็กน้อยในการเรียนรู้ไวยากรณ์และเทคโนโลยี แต่ประโยชน์ที่ได้นั้นมีค่ามากกว่าเชิงลบอย่างมาก


คุณจำแนกแผนที่หรือพับเป็น "ข้อความค้นหา" หรือไม่ ฉันไม่ได้จริงๆ แต่ฉันเดาว่าฉันจะได้เห็นบางที .. ฉันมักจะคิดว่าผลรวมของการคำนวณไม่ใช่ "แบบสอบถาม"
Jimmy Hoffa

@JimmyHoffa ฉันส่วนใหญ่อ้างถึงการประยุกต์ใช้การคำนวณเพื่อการเก็บรวบรวมพื้นฐานไม่จำเป็นต้องคำนวณเอง แต่อาจมีช่องโหว่ในการเปรียบเทียบของฉันมันมีความหมายที่จะเป็นตัวอย่างมากกว่า 100% ถูกต้อง
Daniel B

@ จิมมี่ฮอฟฟาไม่ แต่ฉันไม่แน่ใจว่ามีคำจำกัดความที่เข้มงวดหรือไม่ว่าคำค้นหาเริ่มต้นด้วยอะไร
jk

0

ภาษาที่แตกต่างกันได้รับการพัฒนาเมื่อเวลาผ่านไปสำหรับแหล่งข้อมูลประเภทต่าง ๆ เช่น SQL สำหรับฐานข้อมูลเชิงสัมพันธ์และ XQuery สำหรับ XML ดังนั้นนักพัฒนาจึงต้องเรียนรู้ภาษาคิวรีใหม่สำหรับแหล่งข้อมูลแต่ละประเภทหรือรูปแบบข้อมูลที่พวกเขาต้องสนับสนุน LINQ ทำให้สถานการณ์นี้ง่ายขึ้นโดยนำเสนอรูปแบบที่สอดคล้องกันสำหรับการทำงานกับข้อมูลในแหล่งข้อมูลและรูปแบบต่างๆ ในแบบสอบถาม LINQ คุณจะทำงานกับวัตถุเสมอ สำหรับการเยี่ยมชมhttp://msdn.microsoft.com/en-us/library/bb397906.aspx


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