2009-03-10 17 views
8

का उपयोग करते समय शून्य संदर्भों को संभालना क्या है (उदाहरण के लिए) शून्य संदर्भों के लिए एक बेहतर/छोटा तरीका है, उदाहरण के लिए जब मैं LinqToXML का उपयोग कर रहा हूं।जैसे कि लिंक-टू-एक्सएमएल

मैंने XElement के लिए यह विस्तार लिखा है जो इसे काफी अच्छी तरह से संभालता है, लेकिन शायद एक और तरीका है?

और फ़ंक्शन नाम के बारे में क्या? "और" वास्तव में वर्णनात्मक नहीं है।

public static class XmlExtentions 
{ 
    public static T And<T>(this T obj, Func<T, T> action) where T : XElement 
    { 
     return obj == null ? obj : action(obj); 
    } 
} 

internal class Program 
{ 
    private static void Main() 
    { 
     //create example xml element 
     var x = 
      XElement.Parse("<root><find><name>my-name</name></find></root>"); 

     //old way 
     var test1 = x.Element("find"); 
     if (test1 != null) test1 = test1.Element("name"); 
     Console.WriteLine(test1); 

     //using the extentions method 
     var test2 = x.Element("find").And(findme => findme.Element("name")); 
     Console.WriteLine(test2); 

     Console.ReadLine(); 
    } 
} 

पीएस: मुझे पता है कि मैं इस उदाहरण के लिए XPath का उपयोग कर सकता हूं, लेकिन यह हमेशा अधिक जटिल मामलों में मामला नहीं है।

उत्तर

5

समग्र दृष्टिकोण उचित है - हालांकि मुझे Func<T,T> के बारे में निश्चित नहीं है जो थोड़ा सा प्रतिबंधक लगता है। यदि आप एक ही चीज़ को वापस करने के लिए सीमित हैं, तो मुझे आश्चर्य है कि अगर नाम (string) स्वीकार कर रहा है तो दूसरा तर्क आसान नहीं होगा?

पुनः नामकरण - शायद LINQ से उधार लेते हैं? यह essentaially एक Select है - कैसे SelectOrDefault के बारे में:

public static TResult SelectOrDefault<TSource, TResult>(
    this TSource obj, Func<TSource, TResult> selector) where TSource : class 
{ 
    return SelectOrDefault<TSource, TResult>(
     obj, selector, default(TResult)); 
} 

public static TResult SelectOrDefault<TSource, TResult>(
    this TSource obj, Func<TSource, TResult> selector, 
    TResult @default) where TSource : class 
{ 
    return obj == null ? @default : selector(obj); 
} 

(संपादित) शायद अतिरिक्त XElement विशिष्ट साथ:

public static XElement SelectOrDefault(
    this XElement element, XName name) 
{ 
    return element == null ? null : element.Element(name); 
} 
+0

मैं पहला उदाहरण की तरह है, हालांकि मैं बस अपना कोड को संपादित कर सकता है "जहाँ करने के लिए टी : वर्ग "और लगभग एक ही परिणाम है। लेकिन अन्य प्रकारों को वापस करने की क्षमता एक अच्छा अतिरिक्त है! –

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