sourcenouveau
sourcenouveau

Reputation: 30534

Basic LINQ expression for an ItemCollection

I have an ItemCollection that I'd like to query using LINQ. I tried the following (contrived) example:

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

Visual Studio keeps telling me 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'.

How do I fix the problem?

Upvotes: 55

Views: 20502

Answers (2)

patjbs
patjbs

Reputation: 4772

You need to specify the type of "item"

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

Upvotes: 4

Jon Skeet
Jon Skeet

Reputation: 1502446

It's because ItemCollection only implements IEnumerable, not IEnumerable<T>.

You need to effectively call Cast<T>() which is what happens if you specify the type of the range variable explicitly:

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

In dot notation, this is:

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

If course, if you have a better idea of what's in the collection, you could specify a more restrictive type than object.

Upvotes: 103

Related Questions