IEnumerable<Book> _Book_IE
List<Book> _Book_List
Run Code Online (Sandbox Code Playgroud)
我怎么做才能转换_Book_List成IEnumerable格式?
在Stack Overflow上有一些关于这个的帖子,但没有一个答案似乎解决了我目前的情况.
我有一个页面,其中包含一个表格,每行有许多文本字段和一个下拉列表.所有下拉列表都需要使用相同的SelectList数据,所以我按如下方式设置:
调节器
ViewData["Submarkets"] = new SelectList(submarketRep.AllOrdered(), "id", "name");
Run Code Online (Sandbox Code Playgroud)
视图
<%= Html.DropDownList("submarket_0", (SelectList)ViewData["Submarkets"], "(none)") %>
Run Code Online (Sandbox Code Playgroud)
我在很多地方使用了这个设置,但由于某种原因,在这个特定的视图中,我得到了错误:
没有类型为"IEnumerable"的ViewData项具有键"submarket_0".
我有一个实现IEnumerable但没有实现的类IEnumerable<T>.我不能改变这个类,我不能使用另一个类而不是它.正如我从MSDN中所理解的那样,如果类实现,可以使用LINQIEnumerable<T>.我尝试过使用instance.ToQueryable(),但它仍然没有启用LINQ方法.我确信这个类只能包含一种类型的实例,所以类可以实现IEnumerable<T>,但它没有.那么我该怎么做才能使用LINQ表达式查询这个类?
我正在考虑为我的自定义集合(树)实现IEnumerable,所以我可以使用foreach来遍历我的树.但据我所知,foreach总是从集合的第一个元素开始.我想选择foreach从哪个元素开始.有可能以某种方式改变foreach开始的元素吗?
使用扩展方法,我们可以编写方便的LINQ运算符来解决泛型问题.
我想System.Linq知道命名空间中缺少哪些方法或重载以及如何实现它们.
可能使用现有方法的清洁和优雅的实现是首选.
我正在开发一个ac#program,它有一个"IEnumerable users",可以存储400万用户的ID.我需要遍历Ienummerable并每次提取批量1000个ID以在另一个方法中执行某些操作.
如何从Ienumerable开始一次提取1000个ID ...做一些其他事情然后获取下一批1000等等?
这可能吗?
在C#中,我使用LINQ和IEnumerable一点点.一切都很好(或至少大部分都是如此).
但是,在很多情况下,我发现自己需要一个空IEnumerable<X>的默认值.也就是说,我想
for (var x in xs) { ... }
Run Code Online (Sandbox Code Playgroud)
无需空检查即可工作.现在这是我目前所做的,取决于更大的背景:
var xs = f() ?? new X[0]; // when xs is assigned, sometimes
for (var x in xs ?? new X[0]) { ... } // inline, sometimes
Run Code Online (Sandbox Code Playgroud)
现在,虽然上面对我来说完全没问题 - 也就是说,如果创建数组对象有任何"额外开销"我只是不在乎 - 我想知道:
在C#/ .NET中是否存在"空的不可变IEnumerable/IList"单例?(而且,即使没有,是否有一种"更好"的方式来处理上述情况?)
Java具有Collections.EMPTY_LIST不可变的单例 - "良好类型"的通道Collections.emptyList<T>()- 用于此目的,虽然我不确定类似的概念是否甚至可以在C#中工作,因为泛型的处理方式不同.
谢谢.
它最近向我指出,各种LINQ的扩展方法(如Where,Select等)返回IEnumerable<T>,恰巧也有IDisposable.以下评估结果True
new int[2] {0,1}.Select(x => x*2) is IDisposable
Run Code Online (Sandbox Code Playgroud)
我是否需要处理Where表达式的结果?
每当我打电话给一个方法返回时IEnumerable<T>,我(可能)接受在我完成它时调用dispose的责任吗?
扩展方法ToList()返回一个List<TSource>.遵循相同的模式,ToDictionary()返回一个Dictionary<TKey, TSource>.
我很好奇,为什么这些方法没有键入他们的返回值IList<TSource>和IDictionary<TKey, TSource>分别.这似乎更奇怪,因为将ToLookup<TSource, TKey>其返回值作为接口而不是实际实现.
使用dotPeek或其他反编译器查看这些扩展方法的来源,我们看到以下实现(显示ToList()因为它更短):
public static List<TSource> ToList<TSource>(this IEnumerable<TSource> source) {
if (source == null) throw Error.ArgumentNull("source");
return new List<TSource>(source);
}
Run Code Online (Sandbox Code Playgroud)
那么为什么这个方法将其返回值键入为接口的特定实现而不是接口本身呢?唯一的变化是返回类型.
我很好奇,因为IEnumerable<>扩展在签名上非常一致,除了这两种情况.我一直认为这有点奇怪.
此外,为了使事情更加混乱,州的文件ToLookup():
根据指定的键选择器函数从IEnumerable创建Lookup.
但是返回类型是ILookup<TKey, TElement>.
在Edulinq,Jon Skeet提到返回类型List<T>不是IList<T>,而是不进一步触及主题.
广泛的搜索没有得到答案,所以在这里我问你:
是否有任何设计决策背后没有键入返回值作为接口,还是只是偶然?
ienumerable ×10
c# ×8
linq ×4
asp.net-mvc ×2
.net ×1
c#-4.0 ×1
dispose ×1
empty-list ×1
for-loop ×1
foreach ×1
interface ×1
iterator ×1
selectlist ×1
singleton ×1
viewdata ×1