मैंने एक सहयोगी के साथ इस रोचक समस्या पर चर्चा की और पहले मैंने सोचा कि जॉनस्केट का समाधान बहुत अच्छा था, लेकिन मेरे सहयोगी ने एक समस्या की ओर इशारा किया, अर्थात् यदि समारोह IEnumerable<T>
का विस्तार है, तो इसका उपयोग किया जा सकता है जहां संग्रह उपकरण यह।
एक सरणी के साथ, यह foreach
के साथ उत्पादन के क्रम का ध्यान रखा जाएगा (यानी foreach
पिछले करने के लिए पहले से पुनरावृति जाएगा) कहने के लिए सुरक्षित है, लेकिन यह जरूरी नहीं कि अन्य संग्रह (सूची, शब्दकोश, आदि) के साथ मामला नहीं होगा, जहां foreach
आवश्यक रूप से "प्रविष्टि का आदेश" प्रतिबिंबित नहीं करेगा। फिर भी समारोह वहां है, और यह भ्रामक हो सकता है।
अंत में, मैं tvanfosson के जवाब देने के लिए कुछ इसी तरह के साथ समाप्त हो गया है, लेकिन एक विस्तार विधि, सरणियों के लिए के रूप में:
public static int[] GetIndexes<T>(this T[]source, Func<T, bool> predicate)
{
List<int> matchingIndexes = new List<int>();
for (int i = 0; i < source.Length; ++i)
{
if (predicate(source[i]))
{
matchingIndexes.Add(i);
}
}
return matchingIndexes.ToArray();
}
यहाँ List.ToArray
उम्मीद कर रहा है पिछले ऑपरेशन के लिए आदेश का सम्मान करेंगे ...
धन्यवाद - मुझे नहीं पता था कि आप ऐसा कर सकते हैं - मैंने सोचा था कि आपको फिर से असाइन करना होगा। – Guy
इसे "प्रक्षेपण प्रारंभकर्ता" कहा जाता है - यह मूल रूप से अभिव्यक्ति के भीतर अंतिम उप-अभिव्यक्ति (जो एक फ़ील्ड या प्रॉपर्टी होना चाहिए) लेता है और नाम के लिए इसका उपयोग करता है। तो आप x.GetFoo() बार कर सकते हैं। यह बार = x.GetFoo() बार के बराबर होगा। –