2010-02-03 8 views
5

शीर्षक प्रकार यह सब कहता है। मुझे लगता है कि DictionaryOrDefault \ ListOrDefault \ CollectionOrDefault विकल्प नहीं दिख रहा है।एक शब्दकोश <T> के लिए सिंगलऑर्डडिल्ट का संग्रह संस्करण क्या है?

क्या ऐसी कोई विधि है? यदि नहीं, तो मैं यह कैसे करूं:

MyClass myObject = MyDictionary 
    .SingleOrDefault(x => 
         { 
          if (x.Value != null) 
           return (x.Value.Id == sourceField.SrcField.Id); 
          else 
           return false; 
         }).Key; 

यदि एक से अधिक मैच हैं? (मैं एक execption क्योंकि SingleOrDefault केवल (एकल परिणाम के लिए है कि कल्पना हो रही है!)।)


लगता है कि मैं जरूरत स्पष्ट होना करने के लिए (हालांकि where जवाब अच्छा लग रहा है)।

मेरे पास उपरोक्त कथन है। मैंने अपना प्रोग्राम बदल दिया ताकि वह हमेशा वापस न आए (वहां कई मान हो सकते हैं जो एक कुंजी से मेल खाते हैं)। यह विफल रहता है इसलिए मैं लौटने के लिए एक संग्रह की तलाश में हूं (केवल एक आइटम के बजाय)।

+0

लिटिल यहाँ स्पष्टीकरण, आप कई मूल्यों को प्राप्त करने के लिए कोशिश कर रहे हैं कि एक भविष्यवाणी, या सिर्फ एक फिट, जो भी हो? –

+1

"शीर्षक प्रकार यह सब कहता है।" वास्तव में, 'DictionaryOrDefault' से आपका क्या मतलब है? अपेक्षित, स्पष्ट रूप से और सही ढंग से अपेक्षित अर्थशास्त्र निर्दिष्ट करें। – jason

+1

तो आप जो चाहते हैं वह कुछ ऐसा है जो कुछ भी मेल नहीं खाता है, या एक सूची अगर कोई या अधिक करता है? –

उत्तर

4

यदि आप भविष्यवाणी से मेल खाने वाले पहले व्यक्ति को वापस लौटना चाहते हैं तो आप IEnumerable<T>.FirstOrDefault(Func<T, bool> predicate) का उपयोग कर सकते हैं।

अन्यथा आप बस IEnumerable<T>.Where(Func<T, bool> predicate) linq एक्सटेंशन देख रहे हैं, जो कि पास किए गए भविष्य से मेल खाने वाले सभी तत्वों को वापस कर देगा। यदि कोई तत्व भविष्यवाणी से मेल नहीं खाता है तो उस बिंदु पर IEnumerable<T> खाली हो जाएगा, जिस बिंदु पर आपको वास्तव में शून्य होने की आवश्यकता है, तो आप देख सकते हैं कि इसमें कुछ भी है या नहीं।

var res = MyDictionary.Where(x => 
         { 
          if (x.Value != null) 
           return (x.Value.Id == sourceField.SrcField.Id); 

          return false; 
         }); 
if (!res.Any()) 
    res = null; 

तो अगर आप absolutly एक सूची के रूप में यह करने की जरूरत है, तो आप सिर्फ कॉल कर सकते हैं

res.ToList(); 

ध्यान दें कि अगर आप वास्तव में एक Dictionary<TKey, TValue> जोड़ तोड़ कर रहे हैं, resKeyValuePair<TKey, TValue> के शामिल होंगे।

+0

मुझे कहां नहीं सोचने के लिए काफी मूर्खतापूर्ण महसूस होता है। मैं बस चारों ओर मुड़ गया। – Vaccano

1

अगर आप की तरह

var mylist = obj.Where(x=>x.attr1 == 4); 

कुछ आप तो देख सकते हैं कि कुछ भी .Any() विधि का उपयोग कर वापस आ गया था

mylist.Any() 
+0

कॉल न करें। टोस्टिस्ट() जब तक आपको इसकी आवश्यकता न हो। भले ही आपको पता है कि आपको तुरंत इसकी आवश्यकता है, कम से कम इसे अगली पंक्ति के लिए सहेजें। –

+0

मुझे याद होगा कि अगली बार, जानकारी के लिए धन्यवाद। –

+0

@ जोएल - क्या ToList को कॉल करने में कमी है? (मैंने ऐसा माना है, लेकिन कभी नहीं जानता था ...) – Vaccano

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