views:

30

answers:

2

I have a custom List (MyCustomList) that implements List(Of MyCustomClass).

I want to run a LINQ query against that and return a filtered MyCustomList.

    Public ReadOnly Property DebitTransactions As MyCustomList
        Get
            Return From item In Me Where item.IsDebit = True Select item
        End Get
    End Property

I get a type conversion here because the LinQ query doesn't return the list in the same MyCustomList that it was filtering. It cannot convert a WhereSelectListIterator object (which is returned) to a MyCustomClass.

I really need the filtered results to be in the same format they came in as. Any suggestions?

A: 

You have to iterate the list, add them to a collection, and return the collection. Linq doesn't support, directly, conversion of iterators to custom return types other than List, arrays and Dictionaries.

Will
+1  A: 

If you implement your own Where exthension method you can keep using linq syntax.

public class MyCustomList : List<MyCustomClass>
{
    public MyCustomList() : base()
    {
    }
    public MyCustomList(IEnumerable<MyCustomClass> coll) : base(coll)
    {
    }
}

public static class MyCustomListExtensions
{
    public static MyCustomList Where(this MyCustomList myList, Func<MyCustomClass, bool> predicate)
    {
        return new MyCustomList(Enumerable.Where(myList, predicate));
    }
}

public class MyCustomClass
{
    public int Int1 { get; set; }
    public string Str1 { get; set; }
}

And here I'm using the custom Where implementation:

        var myList = new MyCustomList()
                         {
                             new MyCustomClass() { Int1 = 1},
                             new MyCustomClass() { Int1 = 2},
                             new MyCustomClass() { Int1 = 3},
                         };

        MyCustomList filteredList = from item in myList where item.Int1 > 1 select item;

        Assert.AreEqual(2, filteredList.Count);
AntonioR