4

我有两个系列。BindingSource 的集合和 DataSet 的集合。现在我尝试在DataSet集合的表类型中找到BindingSource集合对应的数据类型。但我的方法略显优雅。如何使用 LINQ 解决它?

foreach (var bindindSource in view.DataContext)
{
    var dataSource = bindindSource.DataSource;
    string sourceName = ((Type)dataSource).Name;

    foreach (var dataSet in model.DataSource)
    {
        var table = (from DataTable t in dataSet.Tables
                     where ((Type)t.GetType()).Name.Equals(sourceName)
                     select t).FirstOrDefault();
        if (table != null)
        {
            bindindSource.DataSource = table;
            break;
        }
    }
}
4

1 回答 1

2

似乎您正试图将 a与具有相同名称BindingSource的第一个相关联。直接的方法是预先准备一个将您用于查找的名称映射到表的方法:DataTableTypeDictionary

var tablesByName = (from set in model.DataSource 
                    from table in set.Tables 
                    select table) // get all tables of all sets
                   .ToDictionary(table => (table.GetType() as Type).Name)

(如果表格永远不会改变,这可以是一个static只计算一次的字段。)

然后你的其余代码应该减少到:

foreach (var source in view.DataContext) 
{
    DataTable table;
    var name = (source.DataSource as Type).Name;
    if (tablesByName.TryGetValue(name, out table))
    {
        source.DataSource = table;
    }
}

我省略了处理诸如存在重复名称的表之类的事情。(这会ToDictionary()失败,所以你必须在那个电话之前摆脱重复。)

于 2013-05-16T14:35:53.350 回答