Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.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# Linq Groupby、Union和Sum可在多个集合中聚合数据_C#_.net_Linq - Fatal编程技术网

C# Linq Groupby、Union和Sum可在多个集合中聚合数据

C# Linq Groupby、Union和Sum可在多个集合中聚合数据,c#,.net,linq,C#,.net,Linq,导言 1。我有一个StockVolume类,它有一个属性点,类型为ObservableCollection 2.我有另一个类StockAcceptance,有一些属性 public class StockAcceptance { public DateTime Date {get; set;} public int PTE {get; set;} public decimal BidVolume {get; set;} public decimal OfferVo

导言

1。我有一个StockVolume类,它有一个属性点,类型为
ObservableCollection

2.我有另一个类StockAcceptance,有一些属性

public class StockAcceptance
{
    public DateTime Date {get; set;}
    public int PTE {get; set;}
    public decimal BidVolume {get; set;}
    public decimal OfferVolume {get; set;}
}
3.需要将结果加载到
ObservableCollection

解释问题的样本数据

  • 财产日期和PTE是通用的
    • 按日期、PTE对股票承兑进行分组,并将投标量和报价量相加
    • 检查StockVolume是否在StockAcceptance中有日期
    • 如果是,将pte的库存量与bidVolume和OfferVolume的库存量相加,得出结果

我已经开始写一个解决方案,但使用了太多的临时变量和for,foreach循环。这应该可以使用Linq以更好的方式实现,任何Linq专家都愿意分享一些输入?

//按日期分组股票接受,PTE,并将bidVolume和OfferVolume相加
//Group the stock acceptance by Date, PTE and sum the bidVolume and OfferVolume
var groupStock=listStock.GroupBy(s=>new {s.Date,s.PTE})
                .Select(g=>new StockAcceptance
                       {
                            Date=g.Key.Date,
                            PTE=g.Key.PTE,
                            BidVolume=g.Sum(x=>x.BidVolume),
                            OfferVolume=g.Sum(x=>x.OfferVolume)
                       });
 StockVolume sv; 

 //get result you want:
 var result=from p in sv.Points
               join s in groupStock
               on new {Date=p.Date,PTE=p.Pte} equals new {Date=s.Date,PTE=s.PTE} into leftGroup
               from s in leftGroup.DefaultIfEmpty()
               select new Point
               {
                 Date=p.Date,
                 Pte=p.Pte,
                 Volume=s==null?p.Volume:p.Volume-s.BidVolume-s.OfferVolume
               };
//fill result into ObservableCollection<Point> 
ObservableCollection<Point> pCollection=new ObservableCollection<Point>(result);
var groupStock=listStock.GroupBy(s=>new{s.Date,s.PTE}) .选择(g=>new Stock Acceptance { 日期=g.Key.Date, PTE=g.Key.PTE, BidVolume=g.Sum(x=>x.BidVolume), OfferVolume=g.Sum(x=>x.OfferVolume) }); 库存量sv; //获得您想要的结果: var结果=以sv.点表示的p 加入团购 在新的{Date=p.Date,PTE=p.PTE}上等于将新的{Date=s.Date,PTE=s.PTE}放入leftGroup 来自leftGroup.DefaultIfEmpty()中的 选择新点 { 日期=p.Date, Pte=p.Pte, Volume=s==null?p.Volume:p.Volume-s.BidVolume-s.OfferVolume }; //将结果填入ObservableCollection ObservableCollection pCollection=新的ObservableCollection(结果);
//按日期、PTE对库存验收进行分组,并将投标量和报价量相加
var groupStock=listStock.GroupBy(s=>new{s.Date,s.PTE})
.选择(g=>new Stock Acceptance
{
日期=g.Key.Date,
PTE=g.Key.PTE,
BidVolume=g.Sum(x=>x.BidVolume),
OfferVolume=g.Sum(x=>x.OfferVolume)
});
库存量sv;
//获得您想要的结果:
var结果=以sv.点表示的p
加入团购
在新的{Date=p.Date,PTE=p.PTE}上等于将新的{Date=s.Date,PTE=s.PTE}放入leftGroup
来自leftGroup.DefaultIfEmpty()中的
选择新点
{
日期=p.Date,
Pte=p.Pte,
Volume=s==null?p.Volume:p.Volume-s.BidVolume-s.OfferVolume
};
//将结果填入ObservableCollection
ObservableCollection pCollection=新的ObservableCollection(结果);

假设您具备以下条件:

IEnumerable<StockAcceptance> accept = ...;
StockVolume volume = ...;
这将为您提供一个关于
Date
PTE
的分组,并提供适当的总和

您也可以对
StockVolume
点执行相同操作:

var stockVolume = volume.GroupBy(v => new { v.Date, v.PTE },
    (k, g) => new {
        k.Date,
        k.PTE,
        Volume = g.Sum(x => x.Volume)
    });
现在您有了两个组,您可以在
Date
PTE
键上加入这两个组以获得最终结果:

IEnumerable<Point> result = stockAccept.Join(stockVolume, 
    o => new { o.Date, o.PTE },
    i => new { i.Date, i.PTE }, 
    (o, i) => new Point { 
        Date = o.Date, 
        PTE = o.PTE, 
        Volume = o.BidVolume + o.OfferVolume + i.Volume
    });
IEnumerable result=stockAccept.Join(stockVolume,
o=>新的{o.日期,o.PTE},
i=>新的{i.日期,i.PTE},
(o,i)=>新点{
日期=运行日期,
PTE=o.PTE,
体积=o.BidVolume+o.OfferVolume+i.体积
});

假设您具备以下条件:

IEnumerable<StockAcceptance> accept = ...;
StockVolume volume = ...;
这将为您提供一个关于
Date
PTE
的分组,并提供适当的总和

您也可以对
StockVolume
点执行相同操作:

var stockVolume = volume.GroupBy(v => new { v.Date, v.PTE },
    (k, g) => new {
        k.Date,
        k.PTE,
        Volume = g.Sum(x => x.Volume)
    });
现在您有了两个组,您可以在
Date
PTE
键上加入这两个组以获得最终结果:

IEnumerable<Point> result = stockAccept.Join(stockVolume, 
    o => new { o.Date, o.PTE },
    i => new { i.Date, i.PTE }, 
    (o, i) => new Point { 
        Date = o.Date, 
        PTE = o.PTE, 
        Volume = o.BidVolume + o.OfferVolume + i.Volume
    });
IEnumerable result=stockAccept.Join(stockVolume,
o=>新的{o.日期,o.PTE},
i=>新的{i.日期,i.PTE},
(o,i)=>新点{
日期=运行日期,
PTE=o.PTE,
体积=o.BidVolume+o.OfferVolume+i.体积
});

我认为最后一步是不正确的:您正在检查
StockVolume
是否在
StockAcceptance
中有日期和PTE,然后您正在执行
Volume+BidVolume+OfferVolume
。另外,对于第一个例子,生成的卷应该是-19而不是-21,对吗?嗨,安德烈,如果StockAcceptance中有StockVolume中日期的数据,我将只对StockVolume和StockAcceptance求和。由于newVolume=-20-(-4)-5=-21,因此卷将为-21。各点(在StockVolume中)的日期/PTE组合在一起是唯一的吗?PTE将始终是上面指定的。日期会改变。但加上日期,PTE在库存量中是唯一的。我相信最后一步是不正确的:你要检查
StockVolume
是否在
StockAcceptance
中有日期和PTE,然后你要做
Volume+BidVolume+OfferVolume
。另外,对于第一个例子,生成的卷应该是-19而不是-21,对吗?嗨,安德烈,如果StockAcceptance中有StockVolume中日期的数据,我将只对StockVolume和StockAcceptance求和。由于newVolume=-20-(-4)-5=-21,因此卷将为-21。各点(在StockVolume中)的日期/PTE组合在一起是唯一的吗?PTE将始终是上面指定的。日期会改变。但到目前为止,PTE的库存量将是独一无二的。