将lambda传递给函数会产生“推断”错误

时间:2012-06-28 14:41:57

标签: c#-4.0 lambda

我有一个函数可以根据我传入的lambda表达式获取过滤的项目列表。下面是我正在做的一个例子。 List是myBase的ObservableCollection,我传入的过滤器是这样的:t => t.Data.Any()

目前如果我将“filter”替换为上面的lambda它可以工作但是当我传入它并使用局部变量fi​​lter时,我得到一个编译错误,如“无法从使用中推断出来”。尝试明确指定类型参数。“

    protected IEnumerable<myBase> GetByFilter(Expression<Func<myBase, bool>> filter)
    {
        IEnumerable<myBase> itemlList = _items.Where(filter).ToList();
        return itemlList ;
    }

我在这里缺少什么?

编辑-------------------

我试图根据传入的lambda获取原始列表的子集。我想我可以通过lambda行返回另一个observableCollection而不是IEnumerable,如果可能的话?

编辑-------------------

在鲁斯兰的帮助下,我解决了我的问题。我的代码现在编译并看起来像这样:

protected IEnumerable<myBase> GetByFilter(Func<myBase, bool> filter) 
{ 
    IEnumerable<myBase> itemlList = _items.Where(filter).ToList(); 
    return itemlList ; 
} 

我可以传入像“t =&gt; t.Data.Any()”这样的过滤器并获取所有项目等。我只需要从过滤器参数中删除“Expression”。

2 个答案:

答案 0 :(得分:2)

我不知道这个示例是如何使用Queryable扩展“Where”应用于Enumerable集合进行编译的。关于如何使用它仍然不完全清楚。但是,以下编译并运行。

using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq;

namespace TestProject
{
    class myBase
    {
        public int Id;
        public string Data;
    }

    class Program
    {
        static ObservableCollection<myBase> _items;

        static IEnumerable<myBase> GetByFilter(Func<myBase, bool> filter)
        {
            IEnumerable<myBase> itemlList = _items.Where(filter).ToList();
            return itemlList;
        }

        static void Main(string[] args)
        {
            _items = new ObservableCollection<myBase> { 
                new myBase { Id = 1, Data = "" },
                new myBase { Id = 2, Data = "Data" },
                new myBase { Id = 3, Data = "More Data" }
            };

            IEnumerable<myBase> filteredList = GetByFilter(t => t.Data.Any());

            foreach (var item in filteredList)
                Console.WriteLine("{0}: {1}", item.Id, item.Data);
        }
    }
}

结果:

2: Data
3: More Data

答案 1 :(得分:0)

问题出现,因为您的过滤器属于Expression<Func<IdcBase, bool>>类型,但(根据评论)Where集合的_items方法需要一个Func<myBase, bool>

我不知道MyBaseIdcBase之间的关系是什么,但我将 假设 {{1} }继承自IdcBase

如果上述假设是正确的,那么您无法使用期望MyBase的过滤器过滤MyBase列表,因为您可能会在IdcBase中有条目不属于_items类型。您需要提供一个需要输入IdcBase类型的过滤器,或者您需要先将MyBase限制为_items类型的过滤器:

IdcBase