C# 从2数据表中获取每小时的总和

C# 从2数据表中获取每小时的总和,c#,datatable,C#,Datatable,我正在从2数据表中写入一个txt文件。 以下是2个数据表 dt1 Transaction No. Time Amount Date 1 10:00:00 200.00 03/05/2020 2 10:30:11 250.00 03/05/2020 3 11:05:22 140.00 03/05/2020 4

我正在从2数据表中写入一个txt文件。
以下是2个数据表

dt1
Transaction No.    Time         Amount     Date
    1              10:00:00     200.00     03/05/2020
    2              10:30:11     250.00     03/05/2020
    3              11:05:22     140.00     03/05/2020
    4              11:45:33     230.00     03/05/2020
    5              12:15:10     220.00     03/05/2020

dt2
Transaction No.    Added Amount   Date
    1              40.00          03/05/2020
    2              25.00          03/05/2020
    3              40.00          03/05/2020
    4              30.00          03/05/2020
    5              30.00          03/05/2020
下面是我的代码

使用(StreamWriter sw=File.AppendText(文件名))
{

对于(int a=6;a,假设您有两个
DataTable-s
,并用所述数据填充它们

var dt1=新数据表();
var dt2=新数据表();
dt1.Columns.AddRange(新[]
{
新数据列(“交易编号”,类型(int)),
新数据列(“时间”,类型(日期时间)),
新数据列(“金额”,类型(十进制)),
新数据列(“日期”,类型(日期时间)),
});
dt2.Columns.AddRange(新[]
{
新数据列(“交易编号”,类型(int)),
新数据列(“增加金额”,类型(十进制)),
新数据列(“日期”,类型(日期时间)),
});
注意:
类型已替换为
十进制
类型,因为它是处理货币时使用的正确类型

据我所知,您希望
dt1
行按
Time
字段的小时部分进行分组,将
金额
相加,并将
dt2
行中的
添加金额
相加,其中
交易编号
等于分组行中的任何
交易编号。
属于
dt1

这将有助于:

var group=dt1.AsEnumerable().GroupBy(x=>x.Field(1.Hour);
var sb=新的StringBuilder();
某人附加(“日期”);
某人附加(“时间,”.PadLeft(12,”);
sb.AppendLine(“Sum.PadLeft(5)”);
//如果输出中不需要PadLeft,则只需:
//sb.追加行($“日期、时间、金额”);
foreach(组中的var g)
{
var总和=0M;
foreach(g中的var r)
sum+=r.Field(2)+dt2.AsEnumerable()
.式中(x=>x.Field(0)=r.Field(0))
.Sum(x=>x.Field(1));
sb.AppendLine($”{g.First().Field(3).ToString(“MM/dd/yyyy”)},{g.Key.ToString(“00”)}:00,{sum.ToString(“0.00”);
}
注意:您可以使用字段名称而不是索引

输出为:

Date,       Time,  Sum
03/05/2020, 10:00, 515.00
03/05/2020, 11:00, 440.00
03/05/2020, 12:00, 250.00
我不知道
DataTable-s
是否已经包含生成上一个引号块中提到的输出所需的数据,或者您希望在写入文本文件之前附加其余的数据。在第二种情况下,您可以执行以下操作:

var group=dt1.AsEnumerable().GroupBy(x=>x.Field(1.Hour);
var sb=新的StringBuilder();
sb.追加行($“日期、时间、金额”);
对于(变量i=0;i<24;i++)
{
VARG=group.FirstOrDefault(x=>x.Key==i);
如果(g!=null)
{
var总和=0M;
foreach(g中的var r)
sum+=r.Field(2)+dt2.AsEnumerable()
.式中(x=>x.Field(0)=r.Field(0))
.Sum(x=>x.Field(1));
sb.AppendLine($”{g.First().Field(3).ToString(“MM/dd/yyyy”)},{g.Key.ToString(“00”)}:00,{sum.ToString(“0.00”);
}
其他的
sb.AppendLine($“{group.First().First().Field(3).ToString(“MM/dd/yyyy”)},{i.ToString(“00”)}:00,0.00”);
}
如果需要保留相同的小时顺序:

for(变量ii=6;ii<30;ii++)
{
var i=ii>23?ii%24:ii;
VARG=group.FirstOrDefault(x=>x.Key==i);
如果(g!=null)
{
//同样的。。。
}
最后,要创建或覆盖文本文件(
fileName
):

File.WriteAllText(文件名,sb.ToString());
或附加输出:

File.AppendAllText(文件名,sb.ToString());

double sales
然后是
sales.Equals(“”)
这永远不会是真的。这段代码编译了吗?LINQ?加入事务号上的两个数据表。给出一些提示?我会尝试一下。谢谢!
Date,       Time,  Sum
03/05/2020, 10:00, 515.00
03/05/2020, 11:00, 440.00
03/05/2020, 12:00, 250.00