![](/img/trans.png)
[英]How do I use LINQ to filter AND manipulate results based on values intersecting between a child and comparer?
[英]Linq Groupby categorizes but how do I manipulate the values in the collection
我有一个可观察的集合Auctions,它是Type Auction,看起来像
public class Auction
{
public int GroupId {get; set;}
public DateTime Date {get; set;}
public string Hour {get; set;}
public decimal Offer {get; set;}
public decimal Bid {get; set;}
public decimal OfferPrice {get; set;}
public decimal BidPrice {get; set;}
}
该集合包含以下数据,
Group Id Date Hour Offer Bid Offer Price Bid Price
1 27/06/2013 00:00 5.556 86.3 250 0
1 27/06/2013 00:15 0 0 250 0
1 27/06/2013 00:30 0 0 250 0
1 27/06/2013 00:45 0 0 250 0
1 27/06/2013 01:00 0 0 250 0
1 27/06/2013 01:15 5.556 86.3 250 0
2 27/06/2013 01:30 8.68 19.9 100 20
2 27/06/2013 01:45 0 0 100 20
2 27/06/2013 02:00 8.68 19.9 100 20
2 27/06/2013 02:15 0 0 100 20
2 27/06/2013 02:30 8.68 19.9 100 20
2 27/06/2013 02:45 0 0 100 20
2 27/06/2013 03:00 8.68 19.9 100 20
3 27/06/2013 03:15 87.14 87.1 150 0
3 27/06/2013 03:30 0 0 150 0
3 27/06/2013 03:45 0 0 150 0
3 27/06/2013 04:00 0 0 150 0
3 27/06/2013 04:15 0 0 150 0
3 27/06/2013 04:30 0 0 150 0
3 27/06/2013 04:45 0 0 150 0
3 27/06/2013 05:00 0 0 150 0
现在我想做的是
例,
通过Linq做到这一点的最佳方法是什么?
需要添加结果的集合是BOD类型,并且包含
Public class BOD
{
public DateTime Date {get; set;}
public string Time {get; set;}
public decimal Volume {get; set;}
public decimal Price {get; set;}
}
您可以尝试类似的方法:
var list = new List<YourType>(); // Your data source
var groupedList = list.GroupBy(listEntry => listEntry.GroupId);
foreach(var groupList in groupedList)
{
var unionList = groupList.ToList()
.Union(list.Where(listEntry => listEntry.GroupId != groupList.Key)
.Select(listEntry => new YourType { GroupId = groupList.Key, a = 0, b = 0, c = listEntry.c }))
}
您可以将拍卖列表加入到唯一的GroupId列表中:
var q = (from a in Auctions
from g in (Auctions.Select(aa=>aa.GroupId).Distinct())
orderby g, a.Date, a.Hour
select new Auction
{
GroupId = g,
Date = a.Date,
Hour = a.Hour,
Offer = a.GroupId == g ? a.Offer : 0,
Bid = a.GroupId == g ? a.Bid : 0,
OfferPrice = a.GroupId == g ? a.OfferPrice : 0,
BidPrice = a.GroupId == g ? a.BidPrice : 0
}
这样的事情应该起作用:
var group1 =
(from a in auctions where a.GroupId == 1 select a).Union(
from a in auctions
where a.GroupId != 1
select new Auction { GroupId = 1, Date = a.Date, Hour = a.Hour });
除非您特意复制它们,否则新的拍卖将包含零。 您希望摆脱硬编码的ID,但这并不难解决。
我不确定添加其他组中的项目是否正确,但请查看以下查询:
var auctions = new List<Auction>
{
new Auction {GroupId = 1, Date = DateTime.Parse("27/06/2013"), Hour = "00:00", Offer = 5.556m, Bid = 86.3m, OfferPrice = 250m, BidPrice = 0m},
new Auction {GroupId = 1, Date = DateTime.Parse("27/06/2013"), Hour = "00:15", Offer = 0m, Bid = 0m, OfferPrice = 250m, BidPrice = 0m},
new Auction {GroupId = 1, Date = DateTime.Parse("27/06/2013"), Hour = "00:30", Offer = 0m, Bid = 0m, OfferPrice = 250m, BidPrice = 0m},
new Auction {GroupId = 1, Date = DateTime.Parse("27/06/2013"), Hour = "00:45", Offer = 0m, Bid = 0m, OfferPrice = 250m, BidPrice = 0m},
new Auction {GroupId = 1, Date = DateTime.Parse("27/06/2013"), Hour = "01:00", Offer = 0m, Bid = 0m, OfferPrice = 250m, BidPrice = 0m},
new Auction {GroupId = 1, Date = DateTime.Parse("27/06/2013"), Hour = "01:15", Offer = 5.556m, Bid = 86.3m, OfferPrice = 250m, BidPrice = 0m},
new Auction {GroupId = 2, Date = DateTime.Parse("27/06/2013"), Hour = "01:30", Offer = 8.68m, Bid = 19.9m, OfferPrice = 100m, BidPrice = 20m},
new Auction {GroupId = 2, Date = DateTime.Parse("27/06/2013"), Hour = "01:45", Offer = 0m, Bid = 0m, OfferPrice = 250m, BidPrice = 20m},
new Auction {GroupId = 2, Date = DateTime.Parse("27/06/2013"), Hour = "02:00", Offer = 8.68m, Bid = 19.9m, OfferPrice = 100m, BidPrice = 20m},
new Auction {GroupId = 2, Date = DateTime.Parse("27/06/2013"), Hour = "02:15", Offer = 0m, Bid = 0m, OfferPrice = 100m, BidPrice = 20m},
new Auction {GroupId = 2, Date = DateTime.Parse("27/06/2013"), Hour = "02:30", Offer = 8.68m, Bid = 19.9m, OfferPrice = 100m, BidPrice = 20m},
new Auction {GroupId = 2, Date = DateTime.Parse("27/06/2013"), Hour = "02:45", Offer = 0m, Bid = 0m, OfferPrice = 100m, BidPrice = 20m},
new Auction {GroupId = 2, Date = DateTime.Parse("27/06/2013"), Hour = "03:00", Offer = 8.68m, Bid = 19.9m, OfferPrice = 100m, BidPrice = 20m},
new Auction {GroupId = 3, Date = DateTime.Parse("27/06/2013"), Hour = "03:15", Offer = 87.14m, Bid = 87.1m, OfferPrice = 150m, BidPrice = 0m},
new Auction {GroupId = 3, Date = DateTime.Parse("27/06/2013"), Hour = "03:30", Offer = 0m, Bid = 0m, OfferPrice = 150m, BidPrice = 0m},
new Auction {GroupId = 3, Date = DateTime.Parse("27/06/2013"), Hour = "03:45", Offer = 0m, Bid = 0m, OfferPrice = 150m, BidPrice = 0m},
new Auction {GroupId = 3, Date = DateTime.Parse("27/06/2013"), Hour = "04:00", Offer = 0m, Bid = 0m, OfferPrice = 150m, BidPrice = 0m},
new Auction {GroupId = 3, Date = DateTime.Parse("27/06/2013"), Hour = "04:15", Offer = 0m, Bid = 0m, OfferPrice = 150m, BidPrice = 0m},
new Auction {GroupId = 3, Date = DateTime.Parse("27/06/2013"), Hour = "04:30", Offer = 0m, Bid = 0m, OfferPrice = 150m, BidPrice = 0m},
new Auction {GroupId = 3, Date = DateTime.Parse("27/06/2013"), Hour = "04:45", Offer = 0m, Bid = 0m, OfferPrice = 150m, BidPrice = 0m},
new Auction {GroupId = 3, Date = DateTime.Parse("27/06/2013"), Hour = "05:00", Offer = 0m, Bid = 0m, OfferPrice = 150m, BidPrice = 0m}
};
// Create 2 BOD object for each Auction
var b1 =
from a in auctions
from b in new List<BOD> {
new BOD { Date = a.Date, Time = a.Hour, Price = a.BidPrice, Volume = a.Bid },
new BOD { Date = a.Date, Time = a.Hour, Price = a.OfferPrice, Volume = a.Offer }
}
select b;
// Create 2 BOD object with zero price and volume for each Auction with another GroupId
var b2 =
from d in auctions.Select(x => x.GroupId)
from a in auctions.Where(y => y.GroupId != d)
from b in new List<BOD> {
new BOD { Date = a.Date, Time = a.Hour, Price = 0, Volume = 0 },
new BOD { Date = a.Date, Time = a.Hour, Price = 0, Volume = 0 }
}
select b;
var bods = b1.Union(b2);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.