C# Linq Groupby、Union和Sum可在多个集合中聚合数据
导言 1。我有一个StockVolume类,它有一个属性点,类型为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
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的库存量相加,得出结果
//按日期分组股票接受,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的库存量将是独一无二的。