如何使用 C# 获取 DataTable 行中某些文本的计数?
How to get count of certain text in DataTable rows using C#?
我有一个数据表
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 添加两列以获取数据表每一行中 '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;
}
克隆一个具有相同列的空 table 并添加两个作为总和:
DataTable tblResult = tb.Clone();
tblResult.Columns.Add("CountT", typeof(int));
tblResult.Columns.Add("CountF", typeof(int));
Select 列,用于使用 LINQ 计算 T 值和 F 值:
DataColumn[] sensorColumns = tb.Columns.Cast<DataColumn>()
.Where(col => col.ColumnName.StartsWith("Sensor"))
.ToArray();
使用循环将行添加到第二个 table,包括总和列:
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 的 Expression 属性。
定义两个表达式,用传感器列中的 'T' 字符和 'F' 字符计算 table 的字段
(或任何你用于真值和假值的东西)
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)";
....
现在使用相关表达式
将两个计数器列添加到您的 table
DataTable tb=someClass.DataTableMethod(sql);
tb.Columns.Add("CountF", typeof(int), expF);
tb.Columns.Add("CountT", typeof(int), expT);
我有一个数据表
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 添加两列以获取数据表每一行中 '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;
}
克隆一个具有相同列的空 table 并添加两个作为总和:
DataTable tblResult = tb.Clone();
tblResult.Columns.Add("CountT", typeof(int));
tblResult.Columns.Add("CountF", typeof(int));
Select 列,用于使用 LINQ 计算 T 值和 F 值:
DataColumn[] sensorColumns = tb.Columns.Cast<DataColumn>()
.Where(col => col.ColumnName.StartsWith("Sensor"))
.ToArray();
使用循环将行添加到第二个 table,包括总和列:
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 的 Expression 属性。
定义两个表达式,用传感器列中的 'T' 字符和 'F' 字符计算 table 的字段
(或任何你用于真值和假值的东西)
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)";
....
现在使用相关表达式
将两个计数器列添加到您的 table DataTable tb=someClass.DataTableMethod(sql);
tb.Columns.Add("CountF", typeof(int), expF);
tb.Columns.Add("CountT", typeof(int), expT);