我有一个函数可以根据我传入的lambda表达式获取过滤的项目列表。下面是我正在做的一个例子。 List是myBase的ObservableCollection,我传入的过滤器是这样的:t => t.Data.Any()
目前如果我将“filter”替换为上面的lambda它可以工作但是当我传入它并使用局部变量filter时,我得到一个编译错误,如“无法从使用中推断出来”。尝试明确指定类型参数。“
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”。
答案 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>
。
我不知道MyBase
和IdcBase
之间的关系是什么,但我将 假设 {{1} }继承自IdcBase
。
如果上述假设是正确的,那么您无法使用期望MyBase
的过滤器过滤MyBase
列表,因为您可能会在IdcBase
中有条目不属于_items
类型。您需要提供一个需要输入IdcBase
类型的过滤器,或者您需要先将MyBase
限制为_items
类型的过滤器:
IdcBase