相关疑难解决方法(0)

C#中使用的yield关键字是什么?

在" 我如何仅公开IList的片段<>问题"中,其中一个答案包含以下代码段:

IEnumerable<object> FilteredList()
{
    foreach(object item in FullList)
    {
        if(IsItemInPartialList(item))
            yield return item;
    }
}
Run Code Online (Sandbox Code Playgroud)

yield关键字有什么作用?我已经看到它在几个地方被引用,另外一个问题,但我还没弄清楚它实际上做了什么.我习惯于在一个线程产生另一个线程的意义上考虑收益率,但这似乎并不重要.

c# yield

781
推荐指数
16
解决办法
30万
查看次数

yield return仅适用于IEnumerable <T>?

yield return当返回类型是a IGrouping<TKey, TElement>还是IDictionary<TKey, TValue>?时,我可以使用吗?

.net c# ienumerable

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

C#有没有与Python的列表推导相媲美的东西?

我想在C#中生成一个列表.我错过了python的列表推导.是否有一种C#方式来动态创建集合,如列表推导或生成器表达式在python中做?

c# python list-comprehension list

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

需要帮助理解IEnumerable中的C#yield

我正在阅读C#2010 Accelerated.我不知道是什么yield

调用GetEnumerator时,包含yield语句的方法中的代码实际上并未在该时间点执行.相反,编译器生成枚举器类,该类包含yield块代码

public IEnumerator<T> GetEnumerator() { 
    foreach( T item in items ) { 
        yield return item; 
    } 
} 
Run Code Online (Sandbox Code Playgroud)

我也读了一些帮助理解"产量"

yield是一个懒惰的数据生成器,只在检索到第一个后生成另一个项目,而返回一个列表将一次性返回所有内容.

这是否意味着每次调用GetEnumerator都会从集合中获得1个项目?所以第一个电话我得到第一个项目,第二个,我得到第二个,依此类推......?

c#

4
推荐指数
1
解决办法
901
查看次数

如何使用由列表支持的我自己的IQueryable延迟加载

我有一个如下定义的权限列表:

private List<PermissionItem> permissionItems;
private ReadOnlyCollection<PermissionItem> permissionItemsReadOnly;
Run Code Online (Sandbox Code Playgroud)

通过后台线程从Web服务检索此列表.只读版本从List版本填充.

我将此列表公开给我的(相当大的)应用程序的其余部分,如下所示:

public IQueryable<PermissionItem> PermissionItems
{
   get
   {
       // Make sure that the permissions have returned.  
       // If they have not then we need to wait for that to happen.
       if (!doneLoadingPermissions.WaitOne(10000))
           throw new ApplicationException("Could not load permissions");

       return permissionItemsReadOnly.AsQueryable();
   }
}
Run Code Online (Sandbox Code Playgroud)

这一切都很好.用户可以请求权限并在加载后获取.

但是如果我在构造函数(在不同的类中)中有这样的代码:

ThisClassInstanceOfThePermisssions = SecurityStuff.PermissionItems;
Run Code Online (Sandbox Code Playgroud)

然后我相当肯定会阻止,直到权限返回.但是在实际使用权限之前不需要阻止它.

我已经读过IQueryable是"Lazy Loading".(我在我的实体框架代码中使用了此功能.)

有没有办法可以改变它以允许随时引用我的IQueryable,并且只在实际使用数据时阻止?

注意:这是一个"很高兴"的功能.实际上加载权限不会花太长时间.所以,如果这是一个"滚动你自己的"查询/表达的东西,那么我可能会通过.但我很好奇它是如何使它工作的.

.net c# iqueryable .net-4.0

4
推荐指数
1
解决办法
619
查看次数

IEnumerable这样的接口如何在没有正确实现的情况下工作?

根据我对接口的理解,为了使用它们,你必须通过在冒号后面添加接口的名称来声明一个类正在实现它,然后实现这些方法.

我目前正在学习枚举器,IEnumerable等等,这让我很困惑.这是我的意思的一个例子:

static IEnumerable<int> Fibs(int fibCount)
{
    for (int i = 0, prevFib = 1, curFib = 1; i < fibCount; i++) {
        yield return prevFib;
        int newFib = prevFib + curFib;
        prevFib = curFib;
        curFib = newFib;
    }
}
Run Code Online (Sandbox Code Playgroud)

IEnumerable似乎是一个普通的接口,我甚至检查了方法定义,这就是它的样子.

我怎么可能在方法定义中使用接口作为类型/返回类型,何时/如何知道我应该使用某些接口作为此示例中的类型?

编辑:我真的怀疑它与yield关键字有什么关系,因为很多接口都以这种方式用作属性,例如在模型中的MVC中,并像它一样传递给Views.例:

public IEnumerable<Category> Categories {get;set;}
Run Code Online (Sandbox Code Playgroud)

c# ienumerable interface

2
推荐指数
1
解决办法
626
查看次数