Базовое выражение LINQ для ItemCollection - PullRequest
41 голосов
/ 21 июля 2009

У меня есть ItemCollection, который я хотел бы запросить с помощью LINQ. Я попробовал следующий (надуманный) пример:

var lItem =
    from item in lListBox.Items
    where String.Compare(item.ToString(), "abc") == true
    select item;

Visual Studio постоянно говорит мне Cannot find an implementation of the query pattern for source type 'System.Windows.Controls.ItemCollection'. 'Where' not found. Consider explicitly specifying the type of the range variable 'item'.

Как мне решить проблему?

Ответы [ 2 ]

82 голосов
/ 21 июля 2009

Это потому, что ItemCollection реализует только IEnumerable, а не IEnumerable<T>.

Вам необходимо эффективно вызвать Cast<T>(), что происходит, если вы явно указываете тип переменной диапазона:

var lItem = from object item in lListBox.Items
            where String.Compare(item.ToString(), "abc") == 0
            select item;

В точечной записи это:

var lItem = lListBox.Items
                    .Cast<object>()
                    .Where(item => String.Compare(item.ToString(), "abc") == 0));

Если, конечно, если вы лучше представляете, что находится в коллекции, вы можете указать более ограничительный тип, чем object.

4 голосов
/ 21 июля 2009

Вам необходимо указать тип «предмета»

var lItem =
    from object item in lListBox.Items
    where String.Compare(item.ToString(), "abc") == true
    select item;
...