2011-11-28 57 views
5

使用Lambda表達式,我也由一個類的對象,並通過接口定義一個ObservableCollection:在我的Silverlight 4應用一個ObservableCollection

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

class myClass() : myInterface 
{ 
    ... 
} 

ObservableCollection<myInterface> _collection; 

添加新的元素添加到集合之前,我希望確保Name-Property在當前集合元素中不存在。 由於我無法使用包含,我目前遍歷所有元素並手動檢查每個元素。

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

    return false; 
} 

我已閱讀,這也可以通過Lambda表達式來實現,所以我寫了以下內容:

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

但現在我得到一個錯誤,他說,「lambda表達式不能轉換爲類型「myInterface」,因爲它不是委託類型「。 (措辭可能不同,因爲我從德語版本翻譯)

我不知道我必須改變以使其工作。包括using System.Linq;。第二個問題(或者主要問題):我已經讀過,運行時從Contains()方法的O(1)變爲O(n) - 這不會比我當前的檢查更快。那麼將它改爲使用lambda還是有意義的嗎?最後,在我的班級中是否有另一種方法來檢查現有的Name-Property?

由於提前,
弗蘭克

回答

15
  1. 你不必寫一個包含方法,LINQ的任何方法已經這樣做:

    if (!_collection.Any(p => p.Name == name2CheckAgainst)) 
    
  2. 如果你想使用lambda,你必須改變原型您包含方法接受一個lambda(lambda函數只是寫一個匿名函數的另一種方法):

    private bool CollectionContainsElement(Func<myInterface, bool> lambda) 
    { 
        foreach (myInterface item in _collection) 
        if (lambda(item)) 
         return true; 
    
        return false; 
    } 
    
  3. 使用Lambda這裏不會改變你的functi的複雜性在這兩種情況下都是O(n)。所以這只是一個偏好問題。

+0

千恩萬謝,貌似我已經誤讀的例子枝條在含有法的LAMDA。使用Any顯然是:) – Aaginor

2

可以使用Linq Any() method。這是可用的,像這樣:

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

之所以包含的方法是O(1)是在幕後加載你收集到一個哈希表(或類似),並使用哈希碼(後面跟一個電話等於)來檢查元素是否存在。

1

包含不是LINQ擴展,因此您不能使用lambda表達式。它的目的是檢查是否提供對象存在於列表中。

正如其他人所說,任何一個等價的λ-表達兼容的擴展方法

相關問題