【问题标题】:Pass every column of every row of a datatable to a method using Linq? [closed]将数据表每一行的每一列传递给使用 Linq 的方法? [关闭]
【发布时间】:2018-03-08 20:42:23
【问题描述】:

我正在寻找一种方法来避免任务的嵌套 foreach 循环。我想将列名和列值传递给一个方法,用于数据表的每一列和每一行。该方法用于记录。我希望将名称和值作为过程的一部分连接起来,因此生成的字符串是日志消息字符串参数。此外,我希望数据表的结构是未知的。我认为 Linq 可以做到这一点。然而,在写完 datatable.AsEnumerable() 之后,我的大脑一片空白。

【问题讨论】:

  • 为什么不能传递数据表或行集合?两者都有所有行
  • 目标是将每个列的名称和值传递给日志记录方法,因此我最终得到 = 的日志条目。因此,我设想的部分 linq 在将名称和值作为日志消息传递时将它们连接在一起。
  • 看,这种信息在帖子中很重要(以及现有的努力)

标签: c# linq datatable


【解决方案1】:

您可以使用每个DataRowItemArray 来处理每一行中的所有列值。

首先将所有列名收集在一起,这样您就不必继续这样做了:

var colnames = dt.Columns
                 .Cast<DataColumn>()
                 .Select(dc => dc.ColumnName)
                 .ToList();

然后将列名与每一行的行值结合起来:

var ans = dt.AsEnumerable() // foreach DataRow in DataTable
            .Select(r => r.ItemArray // foreach item in DataRow.ItemArray
                          .Zip(colnames, // foreach colname in DataTable.Columns.ColumnName
                               (item, colname) => $"{colname} = {item}") // ColumnName: ColumnValue
                   );

如果你想将结果传递给日志函数,只需使用foreachSelectMany 来展平:

foreach (var msg in ans.SelectMany(r => r))
    LogData(logType, msg);

【讨论】:

  • 说我要调用的方法是LogData(int logType, string message)。可以在第二个 linq 语句中的某处添加该方法吗?假设您将 logType 作为范围内的变量,并且 message 将等于您的插值字符串。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-05
  • 1970-01-01
  • 1970-01-01
  • 2020-08-17
  • 2020-07-22
  • 1970-01-01
相关资源
最近更新 更多