统计DataTable某列中,不同值各自出现的次数,该如何解决
统计DataTable某列中,不同值各自出现的次数
例如 dt中“列1”有5行,出现的值有相同的部分
想将值出现的次数存在对应行的“列2”中。
例如“dt.Rows[i]["列1"]中的值为依次为1、1、2、3、3
dt.Rows[i]["列2"]中的值依次为2、2、1、2、2。
------解决思路----------------------
var query = dt.Rows.Cast<DataRow>().GroupBy(x => x[1].ToString()).Select(x => x.Key + "出现了" + x.Count().ToString() + "次");
------解决思路----------------------


------解决思路----------------------
1.数据库层面解决
如果你的是从数据库查询。
a.在查询那里加多1列,该列是一个count子查询;
b.先对原始查询分组计数,然后再将分组结果和原始查询做连接;
2.在内存层面,dataset/datatable
创建一个新的datatable,这个新的datatable多了1列,存放原datatable的分组统计
3.Linq
比如
DataTable dt = new DataTable();
dt.Columns.Add("col1");
DataRow dr1 = dt.NewRow();
dr1[0] = 1;
dt.Rows.Add(dr1);
DataRow dr2 = dt.NewRow();
dr2[0] = 1;
dt.Rows.Add(dr2);
DataRow dr3 = dt.NewRow();
dr3[0] = 2;
dt.Rows.Add(dr3);
DataRow dr4 = dt.NewRow();
dr4[0] = 3;
dt.Rows.Add(dr4);
DataRow dr5 = dt.NewRow();
dr5[0] = 3;
dt.Rows.Add(dr5);
var newDT = dt.Rows.Cast<DataRow>().GroupBy(x => x[0].ToString()).Select(x => new {col1 = x.Key, col2 = x.Count()}).Select(r => r);
var OldDT = dt.Rows.Cast<DataRow>().Select(x => new {col1=x[0].ToString(),col2=""});
var query = from a in newDT
join b in OldDT on a.col1 equals b.col1
select new {b.col1,a.col2};
输出:
1 2
1 2
2 1
3 2
3 2
例如 dt中“列1”有5行,出现的值有相同的部分
想将值出现的次数存在对应行的“列2”中。
例如“dt.Rows[i]["列1"]中的值为依次为1、1、2、3、3
dt.Rows[i]["列2"]中的值依次为2、2、1、2、2。
------解决思路----------------------
var query = dt.Rows.Cast<DataRow>().GroupBy(x => x[1].ToString()).Select(x => x.Key + "出现了" + x.Count().ToString() + "次");
------解决思路----------------------
DataTable 统计 = new DataTable();
统计.TableName = "统计";
统计.Columns.Add("统计", typeof(int));
统计.Rows.Add(1);
统计.Rows.Add(1);
统计.Rows.Add(2);
统计.Rows.Add(3);
统计.Rows.Add(3);
int[] 列值 = 统计.AsEnumerable().Select(数 => 数.Field<int>("统计")).ToArray();
foreach (int 个 in 列值.Distinct())
信息 += 个.ToString("值00个数:") + 列值.LongCount(列 => 列 == 个).ToString("00个。\n");
MessageBox.Show(信息);
------解决思路----------------------
1.数据库层面解决
如果你的是从数据库查询。
a.在查询那里加多1列,该列是一个count子查询;
b.先对原始查询分组计数,然后再将分组结果和原始查询做连接;
2.在内存层面,dataset/datatable
创建一个新的datatable,这个新的datatable多了1列,存放原datatable的分组统计
3.Linq
比如
DataTable dt = new DataTable();
dt.Columns.Add("col1");
DataRow dr1 = dt.NewRow();
dr1[0] = 1;
dt.Rows.Add(dr1);
DataRow dr2 = dt.NewRow();
dr2[0] = 1;
dt.Rows.Add(dr2);
DataRow dr3 = dt.NewRow();
dr3[0] = 2;
dt.Rows.Add(dr3);
DataRow dr4 = dt.NewRow();
dr4[0] = 3;
dt.Rows.Add(dr4);
DataRow dr5 = dt.NewRow();
dr5[0] = 3;
dt.Rows.Add(dr5);
var newDT = dt.Rows.Cast<DataRow>().GroupBy(x => x[0].ToString()).Select(x => new {col1 = x.Key, col2 = x.Count()}).Select(r => r);
var OldDT = dt.Rows.Cast<DataRow>().Select(x => new {col1=x[0].ToString(),col2=""});
var query = from a in newDT
join b in OldDT on a.col1 equals b.col1
select new {b.col1,a.col2};
输出:
1 2
1 2
2 1
3 2
3 2