首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何在C#中将IEnumerable<T>转换为List<T>?

如何在C#中将IEnumerable<T>转换为List<T>?
EN

Stack Overflow用户
提问于 2008-08-28 05:21:27
回答 5查看 54.3K关注 0票数 17

我正在使用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();

在第一个例子中有没有让它工作的小陷阱?

(不确定使用什么作为这个问题的标题,请随意编辑为更合适的标题)

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2008-08-28 05:23:15

试试这个:

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

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

票数 29
EN

Stack Overflow用户

发布于 2008-08-28 11:22:22

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

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

你不用钥匙的时候为什么还要买字典?你要为这些开销买单。

票数 9
EN

Stack Overflow用户

发布于 2008-08-28 06:21:45

您也可以尝试:

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

基本上,泛型集合很难直接转换,因此除了创建一个新对象之外,您几乎别无选择。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31708

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档