2017-08-28 17 views
7

नीचे दिए गए सी # कोड में, मुझे _() अजीब का उपयोग मिला। क्या कोई इसका मतलब बता सकता है?वाक्यविन्यास का अर्थ: वापसी _(); IENumerable <TSource> _()

public static IEnumerable<TSource> DistinctBy<TSource, TKey>(this IEnumerable<TSource> source, 
      Func<TSource, TKey> keySelector, IEqualityComparer<TKey> comparer) 
{ 
    if (source == null) throw new ArgumentNullException(nameof(source)); 
    if (keySelector == null) throw new ArgumentNullException(nameof(keySelector)); 

    return _(); IEnumerable<TSource> _() 
    { 
     var knownKeys = new HashSet<TKey>(comparer); 
     foreach (var element in source) 
     { 
      if (knownKeys.Add(keySelector(element))) 
       yield return element; 
     } 
    } 
} 

उत्तर

9

कोड और अधिक आसानी से return बयान के बाद एक लाइन ब्रेक डालने से समझा जा सकता है:

return _(); 

IEnumerable<TSource> _() 
{ 
    var knownKeys = new HashSet<TKey>(comparer); 
    foreach (var element in source) 
    { 
     if (knownKeys.Add(keySelector(element))) 
      yield return element; 
    } 
} 

इस संदर्भ में, अंडरस्कोर एक local function के लिए सिर्फ एक मनमाना नाम (जो एक नया है सुविधा सी # 7.0 में पेश की गई)। एक स्थानीय समारोह के रूप में,

return DistinctByHelper(); 

IEnumerable<TSource> DistinctByHelper() 
{ 
    var knownKeys = new HashSet<TKey>(comparer); 
    foreach (var element in source) 
    { 
     if (knownKeys.Add(keySelector(element))) 
      yield return element; 
    } 
} 

_ (या DistinctByHelper) विधि DistinctBy विधि के सभी चर का उपयोग कर सकते हैं: आप चाहें, तो आप अंडरस्कोर एक और वर्णनात्मक नाम से बदल सकते थे।

वैसे, यहाँ दो तरीकों होने के लिए कारण तो यह है कि, किसी भी तर्क रिक्त है मामले में, ArgumentNullExceptionyield return की उपस्थिति के कारण तुरंत फेंक दिया जाएगा जब DistinctBy जब परिणाम प्रगणित है (के बजाय कहा जाता है बयान)।

+4

I * वास्तव में * आशा है कि यह पैटर्न कैच नहीं करेगा। यह सिर्फ बदसूरत है। –

+0

मुझे कभी भी पसंद नहीं आया कि स्थानीय कार्यों में किसी भी तरह की पहचान करने वाले कीवर्ड की कमी क्यों होती है - उदाहरण के लिए, वे स्थानीय प्रतिनिधि या ऑब्जेक्ट प्रारंभकर्ता सूची के लिए आसानी से उलझन में हैं। एक साधारण 'func' कीवर्ड या अनिवार्य लैम्ब्डा वाक्यविन्यास' => 'मदद करेगा)। – Dai

+0

स्थानीय समारोह वैसे भी अनावश्यक लगता है। –

संबंधित मुद्दे