相关疑难解决方法(0)

在C#中,为什么匿名方法不能包含yield语句?

我认为做这样的事情会很好(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并将项目添加到其中.

c# yield anonymous-methods yield-return

85
推荐指数
3
解决办法
2万
查看次数

是否有IEnumerable实现只迭代它的源(例如LINQ)一次

提供itemsq LINQ表达式的结果:

var items = from item in ItemsSource.RetrieveItems()
            where ...
Run Code Online (Sandbox Code Playgroud)

假设每个项目的生成需要一些不可忽略的时间.

有两种操作模式:

  1. 使用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()会再次被召唤.

  2. 我们可以直接使用.ToList(),但这会迫使我们等待最后一项检索,然后才能开始处理第一项.

问题:是否有一个IEnumerable实现会像常规的LINQ查询结果一样首次迭代,但会在进程中实现,以便第二次foreach迭代存储的值?

.net c# linq ienumerable

22
推荐指数
2
解决办法
1883
查看次数

C#中是否有内置类型包含bool和静态方法返回的字符串?

我正在寻找一种从函数或方法返回的类型,首先传达它是否成功,然后将消息(作为字符串)附加到它以传递有关其失败原因的更多信息.它可能是应用程序退出代码的一部分; 但是,我不创建一整套退出代码来索引特定的错误消息.我喜欢单个"成功"退出代码的想法,因此可以快速检查呼叫是否失败并相应地工作.

我想把它作为一系列静态方法(如服务调用)的返回类型,为此我可以创建一个包含这两个字段的类(bool和string); 但是,我觉得这些可能已经存在,尽管我还没有找到它.此外,如果有更好的做法来处理从方法获得此类信息的返回,或者完全反对这些静态类的一般规则,我欢迎您的意见.

为了更好的可视化

    public static <type> CreateSomething(string somethingName)
    {
        ...
        return new <type>("Fail!", "Because...");
    }
Run Code Online (Sandbox Code Playgroud)

.net c# types static-classes

3
推荐指数
1
解决办法
187
查看次数