नेस्टेड foreach - प्रत्येक स्तर पर वस्तु पर काम करने की आवश्यकता - सी #, डिजाइन

मैं कुछ नेस्टेड को रिफैक्ट करने की कोशिश कर रहा था foreach छोरों लेकिन एक मुद्दे में भाग गया। यह मूल कोड है:

foreach(var doc in customTrackerDocuments)
{
foreach(var rule in doc.Rules)
{
foreach(var eval in rule.Evaluations)
{
// Do something with customTrackerDocuments, rules, and evaluations
// doc, rule, and eval are all available here
}
}
}

यह स्पष्ट रूप से साफ और सरल है, इसलिए शायद इसे बस ऐसे ही रहना चाहिए। हालांकि, मैंने हमेशा जटिलता को कम करने और पठनीयता बढ़ाने की कोशिश की, इसलिए मैंने यह कोशिश की:

foreach(var eval in customTrackerDocuments.SelectMany(doc => doc.Rules).SelectMany(rule => rule.Evaluations))
{
// Do something with customTrackerDocuments, rules, and evaluations
// doc and rule are NOT available here
}

मुद्दा यह है कि डॉक्टर और नियम अब नहीं हैंलूप में उपयोग करने के लिए उपलब्ध है। क्या इस दृष्टिकोण के साथ उन्हें उपलब्ध होने का कोई तरीका है? या मुझे केवल पहले विकल्प का उपयोग करना चाहिए जिसमें तीन नेस्टेड लूप हैं?

मेरे पास एक फिडेल है: https://dotnetfiddle.net/oBMfQC

उत्तर:

जवाब के लिए 3 № 1

वे उपलब्ध नहीं हैं क्योंकि आप केवल प्रोजेक्ट कर रहे हैं rule.Evaluations आपके फाइनल में SelectMany। आप एक गुमनाम प्रकार का निर्माण कर सकते हैं:

foreach(var eval in customTrackerDocuments.SelectMany(doc => doc.Rules, rule => new {doc, rule})
.SelectMany(docrule => docrule.rule.Evaluations, eval => new {docrule.doc, docrule.rule, eval}))
{
// eval.doc, eval,rule, eval.eval are available here
}

चाहे वह अधिक पठनीय हो या कम जटिल बहस का विषय हो।


संबंधित सवाल
सबसे लोकप्रिय