在" 我如何仅公开IList的片段<>问题"中,其中一个答案包含以下代码段:
IEnumerable<object> FilteredList()
{
foreach(object item in FullList)
{
if(IsItemInPartialList(item))
yield return item;
}
}
Run Code Online (Sandbox Code Playgroud)
yield关键字有什么作用?我已经看到它在几个地方被引用,另外一个问题,但我还没弄清楚它实际上做了什么.我习惯于在一个线程产生另一个线程的意义上考虑收益率,但这似乎并不重要.
yield return当返回类型是a IGrouping<TKey, TElement>还是IDictionary<TKey, TValue>?时,我可以使用吗?
我想在C#中生成一个列表.我错过了python的列表推导.是否有一种C#方式来动态创建集合,如列表推导或生成器表达式在python中做?
我正在阅读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个项目?所以第一个电话我得到第一个项目,第二个,我得到第二个,依此类推......?
我有一个如下定义的权限列表:
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,并且只在实际使用数据时阻止?
注意:这是一个"很高兴"的功能.实际上加载权限不会花太长时间.所以,如果这是一个"滚动你自己的"查询/表达的东西,那么我可能会通过.但我很好奇它是如何使它工作的.
根据我对接口的理解,为了使用它们,你必须通过在冒号后面添加接口的名称来声明一个类正在实现它,然后实现这些方法.
我目前正在学习枚举器,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# ×6
.net ×2
ienumerable ×2
.net-4.0 ×1
interface ×1
iqueryable ×1
list ×1
python ×1
yield ×1