2

介绍

1.我有一个 StockVolume 类,它有一个属性 Points,它的类型是ObservableCollection<Point>.

public class StockVolume
{
    public ...
    public ObservableCollection<Point> Points {get; set;}
    public ...
}

Point 还具有 date、int、decimal 3 个属性

public class Point
{
    public DateTime Date {get; set;}
    public int Pte {get; set;}
    public decimal Volume {get; set;}
}

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<Point>

解释问题的示例数据

  • 属性 Date 和 PTE 很常见
    • 按日期、PTE 对股票承兑进行分组,并对 bidVolume 和 OfferVolume 求和
    • 检查 StockVolume 在 StockAcceptance 中是否有日期
    • 如果是这样,将 StockVolume 中 pte 的交易量与 StockAcceptance 中的 bidVolume 和 OfferVolume 相加得出结果。

在此处输入图像描述

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

4

2 回答 2

3

假设您有以下内容:

IEnumerable<StockAcceptance> accept = ...;
StockVolume volume = ...;

你应该从最里面,向外工作。您需要处理的第一件事是股票承兑汇票的分组:

var stockAccept = accept.GroupBy(a => new { a.Date, a.PTE },
    (k, g) => new { k.Date, k.PTE, 
        BidVolume = g.Sum(x => x.BidVolume), 
        OfferVolume = g.Sum(x => x.OfferVolume)
    });

这为您提供了一个基于适当总和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
    });
于 2013-06-25T15:41:31.973 回答
1
//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);
于 2013-06-25T15:31:02.280 回答