为什么这个Linq查询不在Dictionary <TKey,TValue>上作为DataSource工作

IAb*_*act 2 linq vb.net datasource datagridview winforms

我在VB中有以下内容:

Dim sources = From source In importSources Select New With _
    {.Type = source.Key, .Source = source.Value.Name}

dgridSourceFiles.DataSource = sources
Run Code Online (Sandbox Code Playgroud)

当我调试时,sources显示一个内存中的查询,并在其中有2条记录.然而,datagrid视图不会显示记录.

那么为什么这不起作用呢?建议可以是VB或C#......

更新

我用的时候:

Dim sources = (From source In importSources Select New With _
    {.Type = source.Key, .Source = source.Value.Name}).ToList()
Run Code Online (Sandbox Code Playgroud)

...显示数据源.

Dan*_*Tao 6

您的LINQ查询被懒惰地评估并且IEnumerable<T>仅实现接口(据我所知),这意味着它的结果直到枚举器调用MoveNext某个地方才会建立(例如,在foreach循环中发生).

似乎DataSource财产没有以这种方式列举其内容.它完全期望IList(或其他一些接口之一 - 见下文)的实现,以便它可以通过索引访问项目.这由控件在内部用于排序,过滤等.考虑到这一点,所有设置DataSource属性的可能是检查对象的类型以查看它是否实现任何支持的接口.所以我认为该DataSource属性不是为了处理这种类型的对象(一个懒惰的评估查询)而设计的.

现在,该ToList调用List<T>使用查询结果填充a ; 这确实实现了IList,因此可以用作DataSource.

我的理解是,原因DataSource仅仅object是因为它需要以下任何接口:

这是根据MSDN文档.