2013-12-16 6 views
11

मेरे पास ऑब्जेक्ट्स की एक सूची है जिसमें एक व्यक्ति ऑब्जेक्ट होता है जिसमें शून्य हो सकती है। मैं क्या करना चाहता हूं वह पहली व्यक्ति वस्तु की नाम संपत्ति का मूल्य प्राप्त करें जो शून्य नहीं है और यदि सभी व्यक्ति वस्तुएं शून्य हैं, तो खाली स्ट्रिंग लौटाएं।LINQ - किसी ऑब्जेक्ट की किसी प्रॉपर्टी का रिटर्निंग मान जो शून्य नहीं है

मेरे सबसे अच्छे प्रयास इस प्रकार है:

string userName = MyObjectList.FirstOrDefault(x => x.Person != null).Person.Name ?? string.Empty; 

मुझे लगता है कि मुझे समझ में क्यों यह काम नहीं करता; यदि व्यक्ति मेरी सूची में प्रत्येक ऑब्जेक्ट के लिए शून्य है, तो हमें डिफ़ॉल्ट मान मिलता है, जो शून्य होगा और जब मैं संपत्ति का उपयोग करने का प्रयास करता हूं तो एक शून्य संदर्भ त्रुटि फेंक देगा।

मैं परिणाम प्राप्त कर सकता हूं कि मैं यह जांच कर सकता हूं कि कोई ऑब्जेक्ट शून्य नहीं है और फिर पहले प्राप्त करना है, लेकिन मैं इसे एक LINQ कथन में पूरा करना चाहता हूं। किसी भी इनपुट की सराहना की है, धन्यवाद।

उत्तर

23

सामान्य चाल कुछ इस तरह दिखेगा:

string userName = MyObjectList.Where(x => x.Person != null) 
           .Select(x => x.Person.Name) 
           .FirstOrDefault() ?? string.Empty; 

या निम्न Servy's suggestion:

string userName = MyObjectList.Where(x => x.Person != null) 
           .Select(x => x.Person.Name) 
           .DefaultIfEmpty(string.Empty) 
           .First(); 

अद्यतन इसके साथ सी # 6 की null-conditional operators यह करने के लिए अब अपेक्षाकृत आसान है:

string userName = MyObjectList.FirstOrDefault(x => x.Person != null)?.Person.Name ?? string.Empty; 
+0

स्वच्छ, एकल LINQ क्वेरी –

+2

आप कर सकते हैं के लिए +1 यदि आप चाहें तो इसे पूरी तरह से LINQ समाधान बनाने के लिए 'DefaultIfEmpty' का भी उपयोग करें। – Servy

+0

@ सर्वी अच्छा बिंदु। मैंने एक डिफ़ॉल्ट IfEmpty समाधान शामिल किया है जो काम करना चाहिए। –

0

आप एक शून्य वस्तु तक पहुंच रहे हैं और इसकी गुणों को पढ़ने की कोशिश कर रहे हैं।

कुछ इस तरह में देखो:

var obj = MyObjectList.FirstOrDefault(x => x.Person != null); 
string userName = string.Empty; 
if (null != obj) { 
    userName = obj.Person.Name; 
} 

गुड लक!

2

मैं दो बयानों के रूप में इस करना होगा:

var personContainer = MyObjectList.FirstOrDefault(x => x.Person != null); 
string userName = personContainer == null ? string.Empty : personContainer.Person.Name; 
-1

आप पहले जाँच कर सकते हैं आप नहीं अशक्त व्यक्ति है:

string userName = (MyObjectList.Any((x => x.Person != null))) ? MyObjectList.FirstOrDefault(x => x.Person != null).Person.Name : stringEmpty; 
+0

यह मेरा प्रारंभिक समाधान था, जो काम करता है। स्वीकार्य समाधान इसे एक ही प्रश्न में पूरा करता है। यद्यपि कि आपकी इस सहायता के लिए धन्यवाद! – lobsterhat

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