如何在 C# 中将 IEnumerable<T> 转换为 List<T>?
题
我使用 LINQ 查询通用字典,然后使用结果作为 ListView (WebForms) 的数据源。
简化代码:
Dictionary<Guid, Record> dict = GetAllRecords();
myListView.DataSource = dict.Values.Where(rec => rec.Name == "foo");
myListView.DataBind();
我以为这会起作用,但实际上它会抛出一个 系统无效操作异常:
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();
第一个示例中是否有一个小问题使其工作?
(不确定使用什么作为这个问题的标题,请随意编辑为更合适的内容)
解决方案
尝试这个:
var matches = dict.Values.Where(rec => rec.Name == "foo").ToList();
请注意,这本质上是从原始 Values 集合创建一个新列表,因此对字典的任何更改都不会自动反映在绑定控件中。
其他提示
我倾向于使用新的 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");
仅添加下一句知识并不能从数据库中恢复任何数据。只需创建查询(因为它是 iqueryable 类型)。要启动此查询,您必须在末尾添加 .ToList() 或 .First() 。
dict.Values.Where(rec => rec.Name == "foo")
不隶属于 StackOverflow