如何在 C# 中将 IEnumerable<T> 转换为 List<T>?
Posted
技术标签:
【中文标题】如何在 C# 中将 IEnumerable<T> 转换为 List<T>?【英文标题】:How can I convert IEnumerable<T> to List<T> in C#? 【发布时间】:2010-09-07 02:21:59 【问题描述】:我正在使用 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 是数据源分页 真的。
为了让它工作,我不得不采取以下措施:
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();
在第一个示例中是否有一个小问题可以让它发挥作用?
(不知道用什么作为这个问题的标题,请随时编辑为更合适的内容)
【问题讨论】:
这是***.com/questions/472669/…的反面 【参考方案1】:试试这个:
var matches = dict.Values.Where(rec => rec.Name == "foo").ToList();
请注意,这实际上是从原始 Values 集合创建一个新列表,因此对字典的任何更改都不会自动反映在绑定控件中。
【讨论】:
【参考方案2】:我倾向于使用新的 Linq 语法:
myListView.DataSource = (
from rec in GetAllRecords().Values
where rec.Name == "foo"
select rec ).ToList();
myListView.DataBind();
为什么不使用密钥时会得到字典?你要为这些开销买单。
【讨论】:
@Keith:我在代码中的其他地方使用了字典中的 Guid 键,因此我可以通过记录 ID 获取记录。同意不同意语法;)【参考方案3】:你也可以试试:
var matches = new List<Record>(dict.Values.Where(rec => rec.Name == "foo"));
基本上泛型集合很难直接转换,所以你真的别无选择,只能创建一个新对象。
【讨论】:
【参考方案4】:myListView.DataSource = (List<Record>) dict.Values.Where(rec => rec.Name == "foo");
【讨论】:
@lomaxx :您的第一个解决方案不起作用。我似乎无法将 where 子句的结果转换为 List1[Record]' to type 'System.Collections.Generic.List
1[Record]”的对象。仅在下一句中添加知识不会从 de db 中恢复任何数据。只需创建查询(因为它是 iqueryable 类型)。要启动此查询,您必须在末尾添加 .ToList() 或 .First()。
dict.Values.Where(rec => rec.Name == "foo")
【讨论】:
以上是关于如何在 C# 中将 IEnumerable<T> 转换为 List<T>?的主要内容,如果未能解决你的问题,请参考以下文章
在 C# 中将 List<IEnumerable<int>> 转换为 List<int> [重复]
如何在 LINQ 中将 Group By 与 Task<IEnumerable<Entity>> 一起使用
如何在 C# 中使用 Ienumerable 反转一系列元素?