C# 如何使用C获取DataTable行中某些文本的计数?
我有一个数据表C# 如何使用C获取DataTable行中某些文本的计数?,c#,datatable,C#,Datatable,我有一个数据表 Id readTime DeviceId Sensor1 Sensor2 Sensor3 ........ Sensor13 1 2015-01-26 09:50:27.000 123 T T F F . . . 13 2015-01-26 09:50:27.000 874 T F F T 我想在此DataT
Id readTime DeviceId Sensor1 Sensor2 Sensor3 ........ Sensor13
1 2015-01-26 09:50:27.000 123 T T F F
.
.
.
13 2015-01-26 09:50:27.000 874 T F F T
我想在此DataTable中添加两列,以便在DataTable的每一行中获取“T”和“F”值的计数
Id readTime DeviceId Sensor1 Sensor2 Sensor3 ........ Sensor13 CountT CountF
1 2015-01-26 09:50:27.000 123 T T F F 6 7
.
.
.
13 2015-01-26 09:50:27.000 874 T F F T 8 5
我该怎么做
我的问题
string sql=Select * from SensorTable
public DataTable ()
{
DataTable tb=someClass.DataTableMethod(sql);
return tb;
}
克隆具有相同列的空表,并为总和添加两个:
DataTable tblResult = tb.Clone();
tblResult.Columns.Add("CountT", typeof(int));
tblResult.Columns.Add("CountF", typeof(int));
选择用于使用LINQ计算T值和F值的列:
DataColumn[] sensorColumns = tb.Columns.Cast<DataColumn>()
.Where(col => col.ColumnName.StartsWith("Sensor"))
.ToArray();
使用循环将行添加到第二个表中,包括总和列:
foreach (DataRow row in tb.Rows)
{
tblResult.ImportRow(row);
DataRow newRow = tblResult.Rows[tblResult.Rows.Count - 1];
newRow["CountT"] = sensorColumns.Count(c => row.Field<string>(c) == "T");
newRow["CountF"] = sensorColumns.Count(c => row.Field<string>(c) == "F");
}
您需要添加using System.Linq才能使用Linq扩展方法。另一种方法是使用DataColumn的属性 定义两个表达式,用Sensors列中的'T'字符和'F'字符对表中的字段进行计数 或者你用什么来表示真值和假值
string expT = "IIF(Sensor1='T',1,0) + IIF(Sensor2='T',1,0) + IIF(Sensor3='T',1,0)";
string expF = "IIF(Sensor1='F',1,0) + IIF(Sensor2='F',1,0) + IIF(Sensor3='F',1,0)";
....
现在,使用关联的表达式将两个计数器列添加到表中
DataTable tb=someClass.DataTableMethod(sql);
tb.Columns.Add("CountF", typeof(int), expF);
tb.Columns.Add("CountT", typeof(int), expT);
someClass的定义是什么?DataTableMethod由什么组成?糟糕的数据库设计。从设备表中删除列,创建表传感器并与设备表建立关系-您将能够更轻松地实现当前目标。为什么不循环数据表中的所有行,然后循环一行中的所有传感器?@TZHX返回一个数据表。非常感谢您,先生。这是一个非常好的解决方案。