我认为做这样的事情会很好(lambda做一个yield return):
public IList<T> Find<T>(Expression<Func<T, bool>> expression) where T : class, new()
{
IList<T> list = GetList<T>();
var fun = expression.Compile();
var items = () => {
foreach (var item in list)
if (fun.Invoke(item))
yield return item; // This is not allowed by C#
}
return items.ToList();
}
Run Code Online (Sandbox Code Playgroud)
但是,我发现我不能在匿名方法中使用yield.我想知道为什么.该产量的文档只是说,这是不允许的.
由于不允许,我只创建了List并将项目添加到其中.
提供itemsq LINQ表达式的结果:
var items = from item in ItemsSource.RetrieveItems()
where ...
Run Code Online (Sandbox Code Playgroud)
假设每个项目的生成需要一些不可忽略的时间.
有两种操作模式:
使用foreach将允许开始使用集合开头的项目,而不是最终可用的项目.但是,如果我们想稍后再次处理相同的集合,我们将不得不复制保存它:
var storedItems = new List<Item>();
foreach(var item in items){
Process(item);
storedItems .Add(item);
}
// Later
foreach(var item in storedItems){
ProcessMore(item);
}
Run Code Online (Sandbox Code Playgroud)
因为如果我们刚刚制作的foreach(... in items)话temsSource.RetrieveItems()会再次被召唤.
我们可以直接使用.ToList(),但这会迫使我们等待最后一项检索,然后才能开始处理第一项.
问题:是否有一个IEnumerable实现会像常规的LINQ查询结果一样首次迭代,但会在进程中实现,以便第二次foreach迭代存储的值?
我正在寻找一种从函数或方法返回的类型,首先传达它是否成功,然后将消息(作为字符串)附加到它以传递有关其失败原因的更多信息.它可能是应用程序退出代码的一部分; 但是,我不创建一整套退出代码来索引特定的错误消息.我喜欢单个"成功"退出代码的想法,因此可以快速检查呼叫是否失败并相应地工作.
我想把它作为一系列静态方法(如服务调用)的返回类型,为此我可以创建一个包含这两个字段的类(bool和string); 但是,我觉得这些可能已经存在,尽管我还没有找到它.此外,如果有更好的做法来处理从方法获得此类信息的返回,或者完全反对这些静态类的一般规则,我欢迎您的意见.
为了更好的可视化
public static <type> CreateSomething(string somethingName)
{
...
return new <type>("Fail!", "Because...");
}
Run Code Online (Sandbox Code Playgroud)