如何在C#中将IEnumerable <t>转换为List <t>?</t> </t>

时间:2008-08-28 05:21:27

标签: c# linq generics listview

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

第一个例子中是否有一个小问题让它起作用?

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

5 个答案:

答案 0 :(得分:29)

试试这个:

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

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

答案 1 :(得分:9)

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

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

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

答案 2 :(得分:3)

您也可以尝试:

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

基本上,通用集合很难直接投射,所以除了创建新对象外别无选择。

答案 3 :(得分:1)

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

答案 4 :(得分:0)

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

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