繁体   English   中英

我怎样才能转换IEnumerable <T> 列表 <T> 在C#?

[英]How can I convert IEnumerable<T> to List<T> in C#?

我使用LINQ查询泛型字典,然后使用结果作为我的ListView(WebForms)的数据源。

简化代码:

Dictionary<Guid, Record> dict = GetAllRecords();
myListView.DataSource = dict.Values.Where(rec => rec.Name == "foo");
myListView.DataBind();

我认为这会工作,但实际上它会抛出一个System.InvalidOperationException

ID为'myListView'的ListView必须具有实现ICollection的数据源,或者如果AllowPaging为true,则可以执行数据源分页。

为了使它工作,我不得不采取以下措施:

Dictionary<Guid, Record> dict = GetAllRecords();
List<Record> searchResults = new List<Record>();

var matches = dict.Values.Where(rec => rec.Name == "foo");
foreach (Record rec in matches)
    searchResults.Add(rec);

myListView.DataSource = searchResults;
myListView.DataBind();

在第一个例子中是否有一个小问题使它工作?

(不知道该使用什么作为这个问题的标题,随意编辑更合适的东西)

试试这个:

var matches = dict.Values.Where(rec => rec.Name == "foo").ToList();

请注意,这实际上将从原始值集合中创建新列表,因此对字典的任何更改都不会自动反映在绑定控件中。

我倾向于使用新的Linq语法:

myListView.DataSource = (
    from rec in GetAllRecords().Values
    where rec.Name == "foo"
    select rec ).ToList();
myListView.DataBind();

当你不使用密钥时,为什么要收到字典? 你付出了这笔费用。

您也可以尝试:

var matches = new List<Record>(dict.Values.Where(rec => rec.Name == "foo"));

基本上通用集合很难直接投射,所以你真的别无选择,只能创建一个新对象。

myListView.DataSource = (List<Record>) dict.Values.Where(rec => rec.Name == "foo");

只是添加知识,下一句话不能从de db中恢复任何数据。 只创建查询(因为它是iqueryable类型)。 要启动此查询,您必须在末尾添加.ToList()或.First()。

dict.Values.Where(rec => rec.Name == "foo")

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM