开发者

Returning a custom list class type from LINQ Query - return same type going in that is coming out

开发者 https://www.devze.com 2023-01-05 15:45 出处:网络
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.

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 开发者_如何学Cas. Any suggestions?


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


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.

0

精彩评论

暂无评论...
验证码 换一张
取 消