【发布时间】: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