RadComboBoxItemCollection не работает с linq - PullRequest
0 голосов
/ 11 августа 2009

Я создаю несколько методов расширения и получаю некоторые ошибки с RadComboBoxItemCollection, RadComboBoxItemCollection, по-видимому, реализует IEnumerable, но linq продолжает давать мне ошибки, говоря:

"Не удалось найти реализацию шаблон запроса для типа источника 'Telerik.Web.UI.RadComboBoxItemCollection. «Где» не найдено. Рассматривать явно указав тип переменная диапазона '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' "

1 Ответ

1 голос
/ 12 августа 2009

RadComboBoxItemCollection реализует неуниверсальный интерфейс IEnumerable (вместо того, чтобы делать разумные вещи и реализовывать IEnumerable ), поэтому ваши стандартные операции LINQ не будут работать. Сначала вы должны будете использовать метод расширения «Cast»:

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

Теперь у вас есть гораздо более полезный IEnumerable , с которым вы можете делать все виды замечательных вещей:

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