仅当组中的所有元素在列中都具有值时才使用 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 的分组?

仅当组中的所有元素在列中都具有值时才使用 Linq 进行分组

我认为 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
              {
                 //..
              };

这样可以确保您只获得同时具有客户和竞争对手价格的组。