C# 将DataGridView绑定到字典上的惰性LINQ查询

C# 将DataGridView绑定到字典上的惰性LINQ查询,c#,linq,.net-4.0,datagridview,bindingsource,C#,Linq,.net 4.0,Datagridview,Bindingsource,编辑:我注意到当我绑定到字典时,这种情况会发生,这是我在最初的帖子中遗漏的;我已经更新了帖子 如果我将BindingSource的datasource设置为从字典中提取的延迟求值LINQ查询,它似乎可以正常工作,除了一件事:当结果为空时。当查询不返回任何内容时,DataGridView最终会绑定到空的KeyCollection或ValueCollection本身,就好像它是一个数据项一样。这将导致DataGridView中出现一个空行 BindingSource似乎是为了识别空列表是一个包含零项

编辑:我注意到当我绑定到字典时,这种情况会发生,这是我在最初的帖子中遗漏的;我已经更新了帖子

如果我将BindingSource的datasource设置为从字典中提取的延迟求值LINQ查询,它似乎可以正常工作,除了一件事:当结果为空时。当查询不返回任何内容时,DataGridView最终会绑定到空的KeyCollection或ValueCollection本身,就好像它是一个数据项一样。这将导致DataGridView中出现一个空行

BindingSource似乎是为了识别空列表是一个包含零项的数据源而构建的,但它不识别空KeyCollection或ValueCollection是一个包含零项的数据源,而是认为它是一个包含一项(空集合)的数据源

这是否与字典实现(或不实现)的接口有关

例:

。。。
专用只读字典mRecords=新字典();
...
私有IEnumerable GetDataSource()
{
返回mRecords.Values.OrderBy(x=>x.Amount);
}
...
mBindingSource.DataSource=GetDataSource();
...
当然,我可以通过使用ToList()来解决这个问题,但是这样我就失去了惰性评估


非常感谢你这有趣的行为。我还没有独立验证过它,但有一个想法-如果您不介意在空集合的情况下看到一个空行,那么使用
.DefaultIfEmpty()

类似于使用ToList(),不再使用惰性计算。数据源将被设置为null,我需要再次调用该方法以获得任何结果,以便稍后显示。
...
private readonly Dictionary<Record> mRecords = new Dictionary<Record>();
...

private IEnumerable<Record> GetDataSource()
{
   return mRecords.Values.OrderBy(x => x.Amount);
}

...
mBindingSource.DataSource = GetDataSource();
...