IQueryable<SomeType> collection = GetCollection();
foreach (var c in collection)
{
//do some complex checking that can't be embedded in a query
//based on results from prev line we want to discard the 'c' object
}
//here I only want the results of collection - the discarded objects
因此,使用这个简单的代码,获得结果的最佳方法是什么。我应该在foreach之前创建一个List并插入我想要保留的对象,还是有其他方法可以更好地完成这类事情。
我知道还有其他类似主题的帖子,但我觉得我没有得到我需要的东西。
编辑我试过这个
var collection = GetCollection().Where(s =>
{
if (s.property == 1)
{
int num= Number(s);
double avg = Avg(s.x);
if (num > avg)
return true;
else
return false;
}
else return false;
});
我试过这个但是在编译时给出了“带有语句体的lambda表达式无法转换为表达式树”。我没有做对吗?
答案 0 :(得分:2)
//do some complex checking that can't be embedded in a query
我不明白。你可以传递一个委托,它可以指向一个非常复杂的函数(Turing-complete),它检查你是否应该丢弃它:
var result = GetCollection().AsEnumerable().Where(c => {
// ...
// process "c"
// return true if you want it in the collection
});
如果需要,可以在另一个函数中重构它:
var result = GetCollection.Where(FunctionThatChecksToDiscardOrNot);
答案 1 :(得分:0)
如果将它包装到另一个方法中,则可以使用yield return,然后迭代返回的集合,如下所示:
public IEnumerable<SomeType> FindResults(IQueryable<SomeType> collection) {
foreach (var c in collection)
{
if (doComplicatedQuery(c)) {
yield return c;
}
}
}
// elsewhere
foreach (var goodItem in FindResults(GetCollection())) {
// do stuff.
}