2009-08-11 144 views
0

wotrking我創建了一些擴展方法,我越來越有RadComboBoxItemCollection一些錯誤,RadComboBoxItemCollection似乎實現IEnumerable但LINQ不斷給我的錯誤說:RadComboBoxItemCollection不使用LINQ

「找不到一個實現 源類型的查詢模式 'Telerik.Web.UI.RadComboBoxItemCollection'。 'Where'not found。考慮 明確指定 範圍變量'myItem'的類型。

從另一面RadListBoxItemCollection這個代碼

public static bool ContainsValue(this RadComboBoxItemCollection myList, string value) 
{ 
     bool matches = (from myItem in myList where myItem.Value == value select myItem).Count() > 0; 
     return matches; 
} 

工作得很好

public static bool ContainsValue(this IEnumerable<RadListBoxItem> myList, string value) 
{ 
     bool matches = (from myItem in myList where myItem.Value == value select myItem).Count() > 0; 
     return matches; 
} 

我試圖做IEnumerable和這解決了LINQ錯誤,但我得到這個錯誤

「實例參數:無法轉換 從 「Telerik.Web.UI.RadComboBoxItemCollection」 到 「System.Collections.Generic.IEnumerable」」

回答

1

的RadComboBoxItemCollection實現非通用IEnumerable接口(而不是做合理的事情和實現IEnumerable的< RadComboBoxItem>),因此您的標準LINQ操作將不起作用。你將不得不使用「演員」的擴展方法第一:

var result = myList.Items.Cast<RadComboBoxItem>(); 

現在你有一個更有效的IEnumerable < RadComboBoxItem>,你可以做各種美妙的東西:

public static bool ContainsValue(this RadComboBoxItemCollection myList, string value) 
{ 
     return myList.Items.Cast<RadComboBoxItem>().Count(item => item.Value.Equals(value, StringComparison.Ordinal)) > 0; 
} 

然而,比我更有經驗的人可能會對這種方法的表現發言;它可能是更好的性能,只是做舊的(預LINQ)的方式,而不是每個對象轉換爲一RadComboBoxItem:

public static bool ContainsValue(this RadComboBoxItemCollection myList, string value) 
{ 
     foreach (var item in myList) 
      if (item.Value.Equals(value, StringComparison.Ordinal)) 
       return true; 

     return false 
} 
+0

你那裏吧,我曾經使用for循環,Telerik的是更新類似的修復有控制來解決這個問題 – 2009-08-12 15:56:34