【问题标题】:Searching in two collections在两个集合中搜索
【发布时间】:2013-05-16 13:07:55
【问题描述】:

我有两个系列。 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;
        }
    }
}

【问题讨论】:

  • 你不能先创建一个Dictionary<string, DataTable> 将表类型名称映射到表吗?
  • millimoose,对不起,我会用这个解决方案赢得什么?
  • 我个人会告诫不要认为elegance lies in making the code as short as possible。您的代码看起来简单、易读,而且似乎没有什么不必要或重复的。你想改进什么?
  • @peter70 对于一个人来说,你会降低复杂性。因为你正在迭代每个数据集的表列表。其次:它与你做得更好的事情相匹配。您正在寻找DataTable 的名称,但要说明这种情况需要解析三行代码。保留名称到DataTables 的映射并将LINQ 查询减少到字典访问是有意义的。这也应该摆脱丑陋的foreach/break 组合。 (实际上,您应该始终通过将循环提取到 returns 的某个函数中来摆脱它。)
  • @peter70 字典将使用var tablesByName = (from set in model.DataSource from table in set.Tables select table).ToDictionary(table => (table.GetType() as Type).Name) 之类的东西构建,而您的其余代码应该 减少到foreach (var source in view.DataContext) { source.DataSource = tablesByName[(source.DataSource as Type).Name]; }。如果我正确理解您的原始代码的意图和错误处理,请给予或接受实际测试。 (即使用TryGet 而不是[],如果您希望某些表名丢失或处理重复名称。)

标签: c# winforms linq collections


【解决方案1】:

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

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() 失败,因此您必须在调用之前删除重复项。)

【讨论】:

  • 谢谢!这是一个很好的解决方案!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-08-02
  • 2013-12-02
  • 1970-01-01
  • 2019-03-10
  • 2014-07-31
  • 1970-01-01
  • 2021-04-17
相关资源
最近更新 更多