2011-11-28 16 views
5

मेरी सिल्वरलाइट 4 आवेदन में पर लैम्ब्डा अभिव्यक्ति का उपयोग करना, मैं एक ObservableCollection एक वर्ग की वस्तुओं के होते हैं और एक अंतरफलक द्वारा परिभाषित किया गया है जो है: संग्रह करने के लिए एक नए तत्व जोड़ने से पहलेएक ObservableCollection

interface myInterface() 
{ 
    string Name { get; set; } 
    string Value { get; set; } 
} 

class myClass() : myInterface 
{ 
    ... 
} 

ObservableCollection<myInterface> _collection; 

, मैं यह सुनिश्चित करना चाहते हैं कि नाम-संपत्ति वर्तमान संग्रह तत्वों में पहले से मौजूद नहीं है। जैसा कि मैं शामिल नहीं कर सकता, मैं वर्तमान में सभी तत्वों के माध्यम से पुन: सक्रिय करता हूं और प्रत्येक तत्व को मैन्युअल रूप से जांचता हूं।

private bool CollectionContainsElement(string name2CheckAgainst) 
{ 
    foreach (myInterface item in _collection) 
    if (item.Name.Equals(name2CheckAgainst)) 
     return true; 

    return false; 
} 

मैंने पढ़ा है कि यह भी एक लैम्ब्डा अभिव्यक्ति के माध्यम से प्राप्त किया जा सकता है, इसलिए मैं निम्नलिखित लिखा है:

if (!_collection.Contains(p => p.Name == name2CheckAgainst)) 
{ 
    ... 

लेकिन अब मैं कह रही है कि "लैम्ब्डा अभिव्यक्ति नहीं हो सकता है कोई त्रुटि मिलती है, टाइप "myInterface" में परिवर्तित किया गया है, क्योंकि यह कोई प्रतिनिधि-प्रकार नहीं है "। (वॉर्डिंग भिन्न हो सकती है, क्योंकि मैंने इसे जर्मन संस्करण से अनुवादित किया है)

मुझे यकीन नहीं है कि इसे काम करने के लिए मुझे क्या बदलना है। using System.Linq; शामिल है। और दूसरा प्रश्न (या शायद प्राथमिक प्रश्न): मैंने पढ़ा है, कि रनटाइम ओ (1) से होता है() - विधि से ओ (एन) - जो कि मेरे वर्तमान चेक से तेज़ नहीं है। तो क्या यह लैम्ब्डा का उपयोग करने के लिए इसे बदलने के लिए भी समझ में आता है? और आखिरकार, क्या मेरी कक्षा में मौजूदा नाम-संपत्ति की जांच करने में शायद एक और तरीका है?

अग्रिम धन्यवाद,
फ्रैंक

उत्तर

15
  1. आप एक विधि शामिल लिखने के लिए नहीं है, Linq का कोई भी तरीका पहले से ही है कि क्या कर रहा है:

    if (!_collection.Any(p => p.Name == name2CheckAgainst)) 
    
  2. आप एक लैम्ब्डा का उपयोग करना चाहते हैं, तो आप प्रोटोटाइप बदलना होगा

    private bool CollectionContainsElement(Func<myInterface, bool> lambda) 
    { 
        foreach (myInterface item in _collection) 
        if (lambda(item)) 
         return true; 
    
        return false; 
    } 
    
  3. एक लैम्ब्डा का उपयोग करते हुए यहाँ कामकाज की जटिलता परिवर्तन नहीं करता है: के अपने एक लैम्ब्डा स्वीकार करने के लिए विधि शामिल हैं (एक लैम्ब्डा एक गुमनाम समारोह लिखने के लिए सिर्फ एक वैकल्पिक तरीका है) चालू, यह ओ (एन) दोनों मामलों में है। तो यह सिर्फ वरीयता का मामला है।

+0

बहुत धन्यवाद है, लगता है जैसे मैं पढ़ने में भूलना उदाहरण lamda शामिल-विधि में withe। किसी का उपयोग स्पष्ट है :) – Aaginor

2

आप Linq Any() method उपयोग कर सकते हैं। जो इतनी तरह useable है:

if (!_collection.Any(p => p.Name == name2CheckAgainst)) 
{ 
} 

कारण है कि विधि शामिल है हे (1) कि कवर के तहत यह एक HashTable (या समान) में अपने संग्रह लोड करता है और हैश कोड (एक फोन के बाद का उपयोग करता है बराबर करने के लिए) यह जांचने के लिए कि कोई तत्व मौजूद है या नहीं।

1

इसमें LINQ एक्सटेंशन नहीं है और इसलिए आप इसके साथ लैम्ब्डा एक्सप्रेशन का उपयोग नहीं कर सकते हैं। यह जांचने के लिए डिज़ाइन किया गया था कि ऑब्जेक्ट सूची में मौजूद है या नहीं।

के रूप में अन्य लोगों ने कहा, किसी भी एक बराबर लैम्ब्डा अभिव्यक्ति संगत विस्तार विधि

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