Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/338.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何使用C获取DataTable行中某些文本的计数?_C#_Datatable - Fatal编程技术网

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返回一个数据表。非常感谢您,先生。这是一个非常好的解决方案。