मैं थोड़ा उत्सुक हूं क्योंकि इसे FirstOrDefault की बात आने पर "सर्वोत्तम अभ्यास" माना जाता है।फर्स्टऑर्डडिफॉल्ट() लम्बा के साथ फर्स्टऑर्डडिफॉल्ट() के साथ LINQ बनाम?
मैंने पहले से ही यह प्रश्न देखा है, जो मेरे पास मौजूद प्रश्न के समान है, लेकिन मेरे प्रश्न का उत्तर देने के लिए पर्याप्त नहीं है।
इनमें से कौन सा "बेहतर कोड" है? और क्यों?
var foos = GetMyEnumerableFoos();
var foo1 = (from f in foos
where f.Bar == "spider monkey"
select f).FirstOrDefault();
/* OR */
var foo2 = foos.FirstOrDefault(f => f.Bar == "spider monkey");
मैं, बाद की ओर जाते हैं के रूप में IMO, यह क्लीनर कोड के लिए बनाता है। लेकिन मैं उत्सुक हूं कि तकनीक पर "क्या चल रहा है" की "गड़बड़ी" है या नहीं, दूसरी तरफ अधिक कुशल है। यदि आप विभिन्न प्रकार के आईनेमरेबल्स का उपयोग कर रहे हैं तो क्या यह बदलता है? डेटाटेबल्स या स्ट्रिंग एरे या LINQ ऑब्जेक्ट्स की तरह?
========= संपादित ==========
मान लिया जाये कि जॉन स्कीट की पोस्ट सही है, मैं परावर्तक में देख चला गया क्या कहाँ और FirstOrDefault की तरह लग रही देखने के लिए, और
foos.Where के मामले में (च => f.Bar == "मकड़ी बंदर") FirstOrDefault()
public static IEnumerable<TSource> Where<TSource>(this IEnumerable<TSource> source, Func<TSource, bool> predicate)
{
if (source == null)
{
throw Error.ArgumentNull("source");
}
if (predicate == null)
{
throw Error.ArgumentNull("predicate");
}
if (source is Iterator<TSource>)
{
return ((Iterator<TSource>) source).Where(predicate);
}
if (source is TSource[])
{
return new WhereArrayIterator<TSource>((TSource[]) source, predicate);
}
if (source is List<TSource>)
{
return new WhereListIterator<TSource>((List<TSource>) source, predicate);
}
return new WhereEnumerableIterator<TSource>(source, predicate);
}
जो में फ़ीड होगा: यहाँ क्या मैं के साथ आया है।:
public static TSource FirstOrDefault<TSource>(this IEnumerable<TSource> source)
{
if (source == null)
{
throw Error.ArgumentNull("source");
}
IList<TSource> list = source as IList<TSource>;
if (list != null)
{
if (list.Count > 0)
{
return list[0];
}
}
else
{
using (IEnumerator<TSource> enumerator = source.GetEnumerator())
{
if (enumerator.MoveNext())
{
return enumerator.Current;
}
}
}
return default(TSource);
}
foos.FirstOrDefault (f => f.Bar == "मकड़ी बंदर") के मामले में; कि कम से
public static TSource FirstOrDefault<TSource>(this IEnumerable<TSource> source, Func<TSource, bool> predicate)
{
if (source == null)
{
throw Error.ArgumentNull("source");
}
if (predicate == null)
{
throw Error.ArgumentNull("predicate");
}
foreach (TSource local in source)
{
if (predicate(local))
{
return local;
}
}
return default(TSource);
}
देख रहे हैं अभी भी मुझे थोड़ा उलझन में छोड़ देता है, वहाँ क्षमता निश्चित वस्तु प्रकार के लिए उचित इटरेटर का उपयोग करके जोड़ा जाएगा? या क्या यह सब छोड़ने और परीक्षण के माध्यम से लूपिंग शुरू करना अधिक कुशल है? मेरा आंत फिर मुझे बताता है कि यह बाद वाला है।
यह दिलचस्प है। आपके द्वारा उल्लेखित तीन तरीकों में क्या हो रहा है यह देखने के लिए कि आप पोस्ट करने के बाद पोस्ट कर रहे हैं, मैंने थोड़ी अधिक खुदाई की। मैंने उपरोक्त मेरे निष्कर्ष पोस्ट किए हैं ... यह निश्चित रूप से मेरे प्रश्न का उत्तर देने में मदद करता है। –
मैंने चेक नहीं किया है, लेकिन मुझे लगता है कि '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' ', जहां' FirstOrDefault (predicate) 'कॉल स्पष्ट रूप से कॉल करता है। तो 'कहां' संस्करण में 'झूठी' प्रति एक अतिरिक्त कॉल है (और अंतिम 'सत्य', यदि मौजूद है) 'predicate'। –