ฉันกำลังพัฒนาห้องสมุดที่มีไว้สำหรับเผยแพร่สู่สาธารณะ มันมีวิธีการต่าง ๆ สำหรับการทำงานกับชุดของวัตถุ - การสร้างการตรวจสอบการแบ่งและการฉายชุดในรูปแบบใหม่ ในกรณีที่มีความเกี่ยวข้องมันเป็นไลบรารีคลาส C # ที่มีส่วนขยายของสไตล์ LINQ IEnumerable
ที่จะเปิดตัวเป็นแพ็คเกจ NuGet
วิธีการบางอย่างในไลบรารีนี้สามารถให้พารามิเตอร์อินพุตที่ไม่น่าพอใจ ตัวอย่างเช่นในวิธี combinatoric มีวิธีการสร้างชุดnรายการทั้งหมดที่สามารถสร้างขึ้นจากชุดแหล่งที่มาของรายการm ตัวอย่างเช่นกำหนดชุด:
1, 2, 3, 4, 5
และขอให้รวมกัน 2 จะผลิต:
1, 2
1, 3
1, 4
ฯลฯ ...
5, 3
5, 4
เห็นได้ชัดว่าเป็นไปได้ที่จะขอสิ่งที่ไม่สามารถทำได้เช่นให้ชุด 3 รายการจากนั้นขอชุดค่าผสม 4 รายการพร้อมตั้งค่าตัวเลือกที่ระบุว่าสามารถใช้งานได้เพียงครั้งเดียว
ในสถานการณ์สมมตินี้แต่ละพารามิเตอร์จะถูกต้องเป็นรายบุคคล :
- การรวบรวมแหล่งที่มาไม่เป็นโมฆะและมีรายการต่างๆ
- ขนาดที่ต้องการของชุดค่าผสมเป็นจำนวนเต็มบวกที่ไม่ใช่ศูนย์
- โหมดที่ร้องขอ (ใช้แต่ละรายการเพียงครั้งเดียว) เป็นตัวเลือกที่ถูกต้อง
อย่างไรก็ตามสถานะของพารามิเตอร์เมื่อนำมารวมกันทำให้เกิดปัญหา
ในสถานการณ์นี้คุณคาดหวังว่าวิธีการจะยกเว้น (เช่น. InvalidOperationException
) หรือส่งคืนคอลเลกชันที่ว่างเปล่า? ดูเหมือนว่าจะใช้ได้กับฉัน:
- คุณไม่สามารถผลิตการรวมกันของnรายการจากชุดของมรายการที่n> ม.
InvalidOperationException
ถ้าคุณได้รับอนุญาตเท่านั้นที่จะใช้แต่ละรายการครั้งเดียวดังนั้นการดำเนินการนี้ถือว่าเป็นไปไม่ได้ด้วยเหตุนี้ - ชุดของการรวมกันของขนาดnที่สามารถสร้างจากรายการmเมื่อn> mเป็นชุดว่าง ไม่สามารถสร้างชุดค่าผสมได้
อาร์กิวเมนต์สำหรับชุดที่ว่างเปล่า
ข้อกังวลแรกของฉันคือข้อยกเว้นจะป้องกันการโยงสไตล์ LINQ ที่ใช้สำนวนเมื่อคุณจัดการกับชุดข้อมูลที่อาจมีขนาดที่ไม่รู้จัก กล่าวอีกนัยหนึ่งคุณอาจต้องการทำสิ่งนี้:
var result = someInputSet
.CombinationsOf(4, CombinationsGenerationMode.Distinct)
.Select(combo => /* do some operation to a combination */)
.ToList();
หากชุดอินพุตของคุณมีขนาดผันแปรลักษณะการทำงานของรหัสนี้ไม่แน่นอน หาก.CombinationsOf()
มีข้อผิดพลาดเกิดขึ้นเมื่อsomeInputSet
มีองค์ประกอบน้อยกว่า 4 ครั้งบางครั้งรหัสนี้จะล้มเหลวขณะทำงานโดยไม่มีการตรวจสอบล่วงหน้า ในตัวอย่างข้างต้นการตรวจสอบนี้เป็นเรื่องเล็กน้อย แต่ถ้าคุณเรียกมันว่าลงมาครึ่งทางของสายโซ่ยาวของ LINQ นี่อาจจะน่าเบื่อ หากมันส่งคืนชุดว่างเปล่าก็result
จะว่างเปล่าซึ่งคุณอาจจะพอใจอย่างสมบูรณ์
อาร์กิวเมนต์สำหรับข้อยกเว้น
ข้อกังวลประการที่สองของฉันคือการคืนชุดว่างอาจซ่อนปัญหา - ถ้าคุณเรียกวิธีนี้ว่าสายกลางของ LINQ และมันคืนชุดเปล่า ๆ อย่างเงียบ ๆ จากนั้นคุณอาจพบปัญหาในบางขั้นตอนในภายหลังหรือพบว่าตัวเองว่างเปล่า ชุดผลลัพธ์และอาจไม่ชัดเจนว่าเกิดขึ้นเนื่องจากคุณมีบางสิ่งบางอย่างในชุดอินพุต
คุณคาดหวังอะไรและคุณโต้แย้งอะไร