这个是数据源。 看日期 时间规律 4 ,6,8日期少了一条数据
举个例子 4号 SerialNumber 列xxxx65的少了一条 ,6号 SerialNumber xxx40的少了一条
这个时候没有那个数据 就默认添加一条 (末尾的3个值默认为0)。
这里只有2个SerialNumber号(去掉重复的之后 如果是3个 同理)
最后这个DateSet 的要有SerialNumber *CreateTime行才对 (去掉重负的 这个我已经做好了 就是上面的数据的问题)。
看图就知道了 格式不对 对照数据源 原因就是有的没有 没有默认加上 0
你按 createtime 分组查询 正常 一组 2个SerialNumber ,如果没有或少一个,你就插入
我现在只能对dataset处理的了 那个运算的 算法比较复杂 改不动 只能改最终的数据源
@s_p: 你意思是往dataset插入?
@Yu: 恩
@s_p: 一句话 日期有几个 对于的SerialNumber 也要有几个 (值 默认是0 后面的3列)
@s_p: 你可以把 DataTable dt=dataset.Tables[0];
var data=from c in dt.AsEnumerable() select c;
然后通过 LINQ TO DATASET 进行操作
@s_p:
var serialNumbers = new List<string> { "357034026000040", "357034026000065" }; var dt = dataset.Tables[0];
var createTimeGp= from c in dt.AsEnumerable() group c by c.Field<string>("CreateTime") into g where g.Count() != serialNumbers.Count() select new { g.Key, InsertSerialNumber = string.Join(",", serialNumbers.Except(g.Select(n => n.Field<string>("SerialNumber"))).ToArray()) }; foreach(var g in createTimeGp) { foreach (var item in g.InsertSerialNumber.Split(',')) { DataRow insert = dt.NewRow(); insert["SerialNumber"] = item; insert["CreateTime"] = g.Key; insert["NowDistance"] = 0; insert["SpeedLimitCount"] = 0; insert["StopCount"] = 0; dt.Rows.Add(insert); } }
@Yu: en 我试试 这个没测试上面的那个 if (item.RowsCount == 1) { oneRowTimeList.Add(item.CreateTime); } 这个我看就明显有问题 当我的serialNumbers 有3个多个时候 日期可能有2个有 其他的没有 这样就无效 毕竟serialNumbers的个数(去掉重复的)不是固定的
@Yu: 这么晚都回复我的问题 谢谢了朋友
@s_p: 嗯 serialNumbers 个数有变化,只要修改这就行了
var serialNumbers = new List<string> { "357034026000040", "357034026000065" };
@Yu: 恩 谢谢了 朋友 可以了 我测试了下 明天结贴 再一次感谢 !
@Yu: 能帮忙解释下那个linq吗 我linq写的少
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Data; namespace DataSetTest { class Program { static void Main(string[] args) { DataTable dt = new DataTable(); dt.Columns.Add("SerialNumber", typeof(String)); dt.Columns.Add("CreateTime", typeof(DateTime)); for (int i = 0; i < 10; i++) { DataRow newRow = dt.NewRow(); newRow["SerialNumber"] = "SerialNumber1"; newRow["CreateTime"] = DateTime.Today.AddDays(i); dt.Rows.Add(newRow); if (i != 4 && i != 6 && i != 8) { DataRow newRow2 = dt.NewRow(); newRow2["SerialNumber"] = "SerialNumber2"; newRow2["CreateTime"] = DateTime.Today.AddDays(i); dt.Rows.Add(newRow2); } } Console.WriteLine(dt.Rows.Count); DealDS(dt); Console.WriteLine(dt.Rows.Count); Console.ReadKey(); } static void DealDS(DataTable table) { List<DateTime> oneRowTimeList = new List<DateTime>(); var query = from row in table.AsEnumerable() group row by row.Field<DateTime>("CreateTime") into result orderby result.Key select new { CreateTime = result.Key, RowsCount = result.Count() }; foreach (var item in query) { if (item.RowsCount == 1) { oneRowTimeList.Add(item.CreateTime); } } foreach (var time in oneRowTimeList) { DataRow newRow = table.NewRow(); newRow["SerialNumber"] = "default number"; newRow["CreateTime"] = time; table.Rows.Add(newRow); } } } }
SerialNumber的赋值规则我不知道,就没写,关键是那个linq语句有用。对了,DealDS函数里的两个foreach应该可以合并成一个吧,你试试,我对linq也不是很懂
晕 这个linq 我看的也不是很清楚 赋值要求是对应的 SerialNumber 缺少的那个xx65 而且我感觉这个有bug他只处理了2个SerialNumber号的 如果我有3个 我感觉没处理上
这个问题问得不明不白的。如果只是想添加数据,有N种方法。如果对数据处理的速度或是性能方面的要求,
你要说明啊。
要不然,最普通的一个思路是:
1、找出有几个不同的SerialNo放在一个列表中。
2、将Datatable按照日期排序,每个日期检查是否包含全部的SerialNo,不包含就添加一行。
你看下我和Yu |的对话 就知道 其实我感觉我说明白了 你仔细看数据源的规律 和我说的话的意思
确实表达不是很清楚,不过看了Yu的话我也理解了,我给出了一个答案
按照问题,最后结果应该是12条数据,是吗?
可以尝试另外一种思路,用sql语句解决
SELECT t3.*,IsNull(t4.c1,0),Isnull(0,t4.c2),Isnull(t4.c3,0) FROM (select t1.c,t2.createDate from (SELECT DISTINCT c FROM tt) t1 JOIN (SELECT DISTINCT createDate FROM tt) t2 ON 1=1) t3 LEFT JOIN tt t4 ON t3.c=t4.c AND t3.createDate=t4.createDate
列名对应关系:SerialNumbner=c,createTime=CreateDate,NowDistance=c1,SpeedLimitCount=c2,StopCount=c3
@幻天芒: 恩 (没有的默认补上 ) 不能改这个 这个逻辑写的写的有点复杂 统计 我只能改 数据源
@s_p: 同样的思路,对DataTable的数据字段SerialNumber和CreateDate分别去重,然后两重循环判断DataTable中是否有,没有的就构造一条空数据。