仅当组中的所有元素在列中都具有值时才使用 Linq 进行分组
本文关键字:Linq 元素 | 更新日期: 2023-09-27 18:30:35
我尝试创建lastReadings的分组,在那里我可以创建客户和竞争对手的价格。我尝试下面的代码,但这种方法并不能消除仅是客户端的读数。在下表中,我需要消除读数 ID 5 和 6,对于产品 C 和 D,因为没有匹配,并且仅进一步传递可比较的读数。
readingId ProductId Distributor Price
1 A Competitor 8.0
2 A Client 8.1
3 B Competitor 8.3
4 B Client 8.4
5 C Client 8.8
6 D Client 8.9
以下是我到目前为止得到的:
private IEnumerable<PriceComparison> getPriceComparisons(string competitor)
{
IEnumerable<IGrouping<string, LatestReading>> groupingsByProductId =
from latestReading in LatestReadings
group latestReading by latestReading.ProductId;
IEnumerable<PriceComparison> priceComparisons
= from grouping in groupingsByProductId
select new PriceComparison
{
ProductId = grouping.Key,
MyPrice = (from latestReading in grouping
where latestReading.Distributor == Client
select latestReading.Price).FirstOrDefault(),
CompetitorPrice = (from latestRading in grouping
where latestRading.Distributor == competitor
select latestRading.Price).FirstOrDefault()
};
return priceComparisons;
}
实际上,在我写这篇文章时,我得出的结论是,对于"没有竞争对手"的其他创建的分组,竞争对手的价格为 0,所以后来我可以轻松消除这样的分组并且代码有效。但不知何故,这种创建"空"分组的方法感觉不对,有没有更好的方法只关注不包括产品 C 和 D 的分组?
我认为 Join 更适合您要实现的目标,如下所示
var priceComparison =
from a in LatestReadings.Where(r => r.Distributor == Client)
join b in LatestReadings.Where(r => r.Distributor == Competitor)
on a.ProductId equals b.ProductId
select new PriceComparison
{
ProductId = a.ProductId,
MyPrice = a.Price,
CompetitorPrice = b.Price
};
你可以做这样的事情:
//...
IEnumerable<PriceComparison> priceComparisons =
from grouping in groupingsByProductId
where grouping.Any(p => p.Distributor == Client)
&& grouping.Any(p => p.Distributor == competitor)
select new PriceComparison
{
//..
};
这样可以确保您只获得同时具有客户和竞争对手价格的组。