如何在 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 子句的结果转换为 List。它会导致以下运行时异常:无法转换类型为“d__01[Record]' to type 'System.Collections.Generic.List1[Record]”的对象。您的第二个解决方案效果很好,Matt Hamiltons 的效果也很好。我接受了 [Matt Hamiltons](***.co【参考方案5】:

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

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

【讨论】:

以上是关于如何在 C# 中将 IEnumerable<T> 转换为 List<T>?的主要内容,如果未能解决你的问题,请参考以下文章

在 C# 中将 List<IEnumerable<int>> 转换为 List<int> [重复]

在 c# 中将 WhereIf 用于多个条件

如何在 LINQ 中将 Group By 与 Task<IEnumerable<Entity>> 一起使用

如何在 C# 中使用 Ienumerable 反转一系列元素?

在 C# 中:如何声明一个类型为键的通用字典,该类型的 IEnumerable<> 作为值?

IEnumerable<T> 使用 c# 在函数内访问 T 的属性