首页 新闻 会员 周边 捐助

DataSet 的一个逻辑处理的问题 急 求大侠帮忙看下

0
悬赏园豆:20 [已解决问题] 解决于 2013-11-11 13:21

 

这个是数据源。 看日期 时间规律 4 ,6,8日期少了一条数据 

举个例子 4号 SerialNumber 列xxxx65的少了一条  ,6号 SerialNumber xxx40的少了一条

 

这个时候没有那个数据 就默认添加一条 (末尾的3个值默认为0)。

 

这里只有2个SerialNumber号(去掉重复的之后 如果是3个 同理)

最后这个DateSet 的要有SerialNumber *CreateTime行才对 (去掉重负的 这个我已经做好了 就是上面的数据的问题)。

问题补充:

看图就知道了  格式不对   对照数据源  原因就是有的没有 没有默认加上 0

s_p的主页 s_p | 初学一级 | 园豆:140
提问于:2013-11-08 16:09
< >
分享
最佳答案
0

你按 createtime 分组查询 正常 一组 2个SerialNumber ,如果没有或少一个,你就插入 

收获园豆:11
Yu | 专家六级 |园豆:12990 | 2013-11-08 16:14

 我现在只能对dataset处理的了 那个运算的 算法比较复杂 改不动 只能改最终的数据源

s_p | 园豆:140 (初学一级) | 2013-11-08 16:16

@s_p: 你意思是往dataset插入?

Yu | 园豆:12990 (专家六级) | 2013-11-08 16:19

@Yu: 恩

s_p | 园豆:140 (初学一级) | 2013-11-08 16:20

@s_p: 一句话 日期有几个  对于的SerialNumber  也要有几个 (值 默认是0 后面的3列)

s_p | 园豆:140 (初学一级) | 2013-11-08 16:21

@s_p: 你可以把 DataTable dt=dataset.Tables[0];

var data=from c in dt.AsEnumerable() select c;

然后通过 LINQ TO DATASET 进行操作

Yu | 园豆:12990 (专家六级) | 2013-11-08 16:29

@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 | 园豆:12990 (专家六级) | 2013-11-08 22:10

@Yu: en 我试试 这个没测试上面的那个 if (item.RowsCount == 1) { oneRowTimeList.Add(item.CreateTime); }  这个我看就明显有问题  当我的serialNumbers 有3个多个时候  日期可能有2个有 其他的没有  这样就无效 毕竟serialNumbers的个数(去掉重复的)不是固定的

s_p | 园豆:140 (初学一级) | 2013-11-08 23:24

@Yu: 这么晚都回复我的问题 谢谢了朋友 

s_p | 园豆:140 (初学一级) | 2013-11-08 23:25

@s_p: 嗯 serialNumbers 个数有变化,只要修改这就行了

var serialNumbers = new List<string> { "357034026000040", "357034026000065" };

Yu | 园豆:12990 (专家六级) | 2013-11-09 10:30

@Yu: 恩 谢谢了 朋友 可以了 我测试了下  明天结贴  再一次感谢 ! 

s_p | 园豆:140 (初学一级) | 2013-11-10 21:50

@Yu: 能帮忙解释下那个linq吗 我linq写的少 

s_p | 园豆:140 (初学一级) | 2013-11-10 21:53
其他回答(3)
0
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也不是很懂

收获园豆:5
会长 | 园豆:12463 (专家六级) | 2013-11-08 16:13

晕 这个linq 我看的也不是很清楚  赋值要求是对应的 SerialNumber 缺少的那个xx65 而且我感觉这个有bug他只处理了2个SerialNumber号的 如果我有3个 我感觉没处理上

支持(0) 反对(0) s_p | 园豆:140 (初学一级) | 2013-11-08 17:24
0

这个问题问得不明不白的。如果只是想添加数据,有N种方法。如果对数据处理的速度或是性能方面的要求,

你要说明啊。

要不然,最普通的一个思路是:

1、找出有几个不同的SerialNo放在一个列表中。

2、将Datatable按照日期排序,每个日期检查是否包含全部的SerialNo,不包含就添加一行。

收获园豆:2
爱编程的大叔 | 园豆:30844 (高人七级) | 2013-11-08 16:22

你看下我和Yu |的对话 就知道 其实我感觉我说明白了 你仔细看数据源的规律 和我说的话的意思

支持(0) 反对(0) s_p | 园豆:140 (初学一级) | 2013-11-08 16:24

确实表达不是很清楚,不过看了Yu的话我也理解了,我给出了一个答案

支持(0) 反对(0) 会长 | 园豆:12463 (专家六级) | 2013-11-08 16:44
0

按照问题,最后结果应该是12条数据,是吗?

收获园豆:2
幻天芒 | 园豆:37207 (高人七级) | 2013-11-09 00:39

可以尝试另外一种思路,用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

支持(0) 反对(0) 幻天芒 | 园豆:37207 (高人七级) | 2013-11-09 00:45

@幻天芒: 恩 (没有的默认补上 )  不能改这个  这个逻辑写的写的有点复杂 统计  我只能改 数据源 

支持(0) 反对(0) s_p | 园豆:140 (初学一级) | 2013-11-09 17:09

@s_p: 同样的思路,对DataTable的数据字段SerialNumber和CreateDate分别去重,然后两重循环判断DataTable中是否有,没有的就构造一条空数据。

支持(0) 反对(0) 幻天芒 | 园豆:37207 (高人七级) | 2013-11-10 13:11
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册