如何使用 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);