2012-01-10 8 views
8

पहली बार LINQ में एक नोब! फिर, बात यह है कि मैं एक संग्रह है कि है:LINQ में कोई भी() और प्रथम() मिलाएं?

  1. या तो मेरा पहचान पत्र शामिल नहीं है (स्ट्रिंग)
  2. या यह केवल एक बार होता है

मैं उपयोग करना चाहता था, लेकिन मैं कहाँ डॉन

if (MyCollection.Any(rm => rm.BaseName == rbName)) 
{ 
    var tmp = MyCollection.First(rm => rm.BaseName == rbName); 
} 

यह काम करता है लेकिन मैं वास्तव में लगता है कि इस तरह से मैं इसे करना चाहिए नहीं है: 'टी if निर्देश मुझे क्या करना है ... इसलिए यहाँ है की तरह मेरी कोड है LINQ के साथ ... कोई सुझाव?

+0

आपको 'FirstOrDefault' – V4Vendetta

+0

जांचना चाहिए क्यों आप FirstOrDefault() का उपयोग नहीं करते हैं, और क्वेरी के बाद आप जांचते हैं कि आपका परिणाम शून्य है या इसमें आपका डेटा है? – BigL

+0

इस विधि को नहीं पता था :(मैं सिंगलऑर्डफॉल्ट को वैसे भी पसंद करता हूं! –

उत्तर

16

गैर-अद्वितीय इकाई उत्तर

उपयोग SingleOrDefault (कई उदाहरण पर अपवाद फेंकने के साथ)। यदि यह अस्तित्व में है तो यह अद्वितीय आइटम वापस कर देगा, शून्य अगर यह अस्तित्व में नहीं है या यदि एक से अधिक हो तो यह फेंक देगा और अपवाद होगा।

var tmp = MyCollection.SingleOrDefault(rm => rm.BaseName == rbName); 

अद्वितीय संपत्ति उत्तर (वहाँ कई उदाहरण कभी नहीं होगा)

आपके सिस्टम सेट किया गया है ताकि BaseName एक अद्वितीय इकाई, उपयोगकर्ता FirstOrDefault है, यह अगर एक अपवाद फेंक नहीं होगा वहाँ कई उदाहरण हैं क्योंकि यह पहले उदाहरण पर रुक जाएगा, लेकिन सिस्टम डिज़ाइन किया जाएगा, इसलिए कभी भी वही उदाहरण नहीं होगा, इसलिए यह स्वीकार्य होगा (और समय कम हो जाएगा)।

var tmp = MyCollection.FirstOrDefault(rm => rm.BaseName == rbName); 
+0

यह वास्तव में अच्छा है! अपवाद हैंडलिंग बहुत अच्छा है :) –

+1

यह एक अच्छा तरीका है कि अगर कोई मैच होता है तो यह अपवाद फेंक देगा, लेकिन अगर आपका सिस्टम सेटअप है कि डुप्लिकेट के लिए यह संभव नहीं है तो अपवाद की आवश्यकता नहीं होगी, फिर FirstOrDefault के साथ जाएं (केवल तभी जब यह प्राथमिक कुंजी है या प्रविष्टि पर सत्यापन सेट किया गया हो)। – ThePower

5
var tmp = MyCollection.FirstOrDefault(rm => rm.BaseName == rbName)); 

यहाँ tmp अगर आप इस तरह के रिकॉर्ड नहीं है अशक्त हो जाएगा।

1

Any रिटर्न bool को इंगित करता है ऐसी वस्तुओं मौजूद रहने पर, First अपने संग्रह से रिकॉर्ड देता है। तो किसी भी मामले में आपके पास संग्रह और आपकी स्थिति के परिणाम से वस्तु होगी। आप FirstOrDefault का उपयोग कर सकते हैं और फिर null अपने लौटे हुए मूल्य की जांच कर सकते हैं।

var tmp = MyCollection.FirstOrDefault(rm => rm.BaseName == rbName); 
if (tmp != null) 
{ 
    // do something 
} 
2

आप उपयोग कर सकते हैं,

FirstOrDefault() 

या

SingleOrDefault() 
1
var tmp = MyCollection.FirstOrDefault(rm => rm.BaseName == rbName); 
if (tmp != null) 
{ 
    // Do something 
} 
12

thepower कहते हैं, आप SingleOrDefault या शायद FirstOrDefault उपयोग करना चाहिए। यदि वास्तव में केवल एक ही प्रविष्टि है, तो वे वही काम करेंगे, लेकिन FirstOrDefault तेजी से तेज़ हो सकते हैं यदि आप LINQ से ऑब्जेक्ट्स का उपयोग कर रहे हैं - SingleOrDefault को यह देखने के लिए पूर्ण अनुक्रम को स्कैन करना होगा कि कोई अन्य मिलान नहीं है ।

यदि कई मैचों हैं, SingleOrDefault एक अपवाद फेंक देगा; FirstOrDefault सिर्फ पहला मैच लौटाएगा।

तो आप का उपयोग हो सकता है:

var result = MyCollection.FirstOrDefault(rm => rm.BaseName == rbName); 
if (result != null) 
{ 
    // Use it 
} 

नोट यह अजीब हो सकता है कि अगर आपके अनुक्रम तत्व प्रकार एक मान प्रकार है, जैसा कि आप की वजह से तत्व प्रकार के लिए डिफ़ॉल्ट मान के बीच भेद करने में सक्षम नहीं हो सकता है कोई मिलान नहीं है, और एक "वास्तविक" मूल्य है। ऐसा लगता है कि इस मामले में कोई समस्या नहीं होने की संभावना है, लेकिन यह ध्यान में लायक है।

+0

इन परिशुद्धताओं के लिए धन्यवाद! :) –

+0

अच्छा बिंदु जॉन। यह देखना मुश्किल है कि यह एक प्राथमिक कुंजी या विशिष्ट रूप से परिभाषित तत्व था, फिर भी एक महान जोड़ा। – ThePower

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