0

我正在创建一些扩展方法,但 RadComboBoxItemCollection 出现了一些错误,RadComboBoxItemCollection 似乎实现了 IEnumerable 但 linq 不断给我错误说:

“找不到源类型'Telerik.Web.UI.RadComboBoxItemCollection'的查询模式的实现。找不到'Where'。考虑明确指定范围变量'myItem'的类型。”

从这段代码

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;
}

另一方面 RadListBoxItemCollection 工作得很好

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'”

4

1 回答 1

1

RadComboBoxItemCollection 实现了非通用 IEnumerable 接口(而不是做明智的事情并实现 IEnumerable<RadComboBoxItem>),因此您的标准 LINQ 操作将不起作用。您必须首先使用“Cast”扩展方法:

 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
}
于 2009-08-11T20:18:26.153 回答