【问题标题】:Trouble finding duplicates using LINQ expressions使用 LINQ 表达式查找重复项时遇到问题
【发布时间】:2012-11-20 21:34:22
【问题描述】:

我有一个ForecastData 列表,它看起来像这样:

public class ForecastData
{
    public string SalesID {get;set;}
    public string Customer {get;set;}
    public string Vendor {get;set;}
    public string Division {get;set;}
    public int Year {get;set;}
    public decimal Amount {get;set;}
}

我需要为金额 > 0 且年份为 THIS YEAR 的每个“客户”显示每个不同“SalesID”的列表。

目前,我按客户进行分组,但因为我的数据集中可以有多个“金额”用于相同的客户和 SalesID,所以我没有得到预期的结果。我的结果显示:

  1. 客户 1 用户 1 100 美元
  2. 客户 1 用户 1 200 美元
  3. 客户 1 用户 1 300 美元
  4. 客户 1 用户 2 100 美元
  5. 客户 1 用户 2 200 美元

但我想要的是

  1. 客户 1 用户 1 美元 600 美元
  2. 客户 1 用户 2 300 美元

这是我的表达方式:

var forecasts = (List<ForecastData>)cache.Get(_RAW_FORECAST_DATA_KEY, null);

foreach(var custGroup in forecasts.Where(f => f.Year == DateTime.Now.Year).GroupBy(f => f.Customer))
{
    if(custGroup.Count() > 1) // There's more than one forecast for this customer
    {
        foreach(var instance in custGroup)
        {
            toReturn.Add(new MultipleCustomer(custGroup.Key)
            {
                Salesperson = instance.SalesPersonId,
                Forecast = instance.Amount
            });
        }
    }
}

return toReturn;

【问题讨论】:

  • 看看this
  • 你肯定需要对你的 instance.Amount 做一个 Sum。您的分组依据只会对客户对象进行排序

标签: c# linq group-by


【解决方案1】:

我认为,如果您更改查询,使您有一个“外部”GroupBy 和一个“内部”GroupBy,它将解决您的问题:

var forecasts = (List<ForecastData>)cache.Get(_RAW_FORECAST_DATA_KEY, null);

var forecastGroups = forcasts
    .Where(f => f.Year = DateTime.Now.Year)
    .GroupBy(f => f.Customer)
    .Where(grp => grp.Count() > 1)
    .Select(grp => new { Key = grp.Key, SalesGroups = grp.GroupBy(f => f.SalesId) });

foreach(var custGroup in forecastGroups)
{
    if(custGroup.SalesGroups.Count() > 1)
    {
        foreach(var salesGroup in custGroup.SalesGroups)
        {
            toReturn.Add(new MultipleCustomer(custGroup.Key)
            {
                Salesperson = salesGroup.Key,
                Forecast = salesGroup.Sum(f => f.Amount)
            });
        }
    }
}

return toReturn;

【讨论】:

  • 我这样做了,但我仍然没有得到我需要的结果。我觉得我需要先按客户分组,如果计数 > 1,则按 DISTINCT 销售人员分组,如果有多个,我想显示该客户的所有销售人员的金额总和
  • 我刚刚更新了我的答案,但根据您的评论,我认为我需要再修改一下。
  • 不,没用。我同意你的观点,尽管我需要一个“外部”和“内部”组……或者至少我认为我需要。
  • 我认为我无法再访问我的“客户”分组了,我得到的唯一键是销售人员(来自最后一个 GroupBy)。因此,我无法创建 MultipleCustomer 对象,该对象需要 Customer 字符串、Salesperson 字符串和总预测。
  • 我刚刚更新了其余的方法。如果有帮助,请告诉我。
【解决方案2】:

尝试以下方法:

foreach(var custGroup in forecasts.Where(f => f.Year == DateTime.Now.Year).GroupBy(f => new { f.Customer, f.SalesPersonId }).Where(k => k.Count() > 1).Select(k => new { Customer = k.Key.Customer, SalesPersonId = k.Key.SalesPersonId, TotalAmount = k.Sum(x => x.Amount) } )
{
           toReturn.Add(new MultipleCustomer(custGroup.Customer)
           {
              Salesperson = custGroup.SalesPersonId,
              Forecast = custGroup.TotalAmount
           });
       }
   }
}

我一直在写它。附近没有 C# 编译器,所以可能会有一些错误。

您的问题的关键是您需要汇总您的项目并将其金额相加。

【讨论】:

  • 这只是给了我每个预测,其中金额由客户/销售人员分组求和
猜你喜欢
  • 2015-08-24
  • 2021-05-23
  • 2021-02-03
  • 2021-05-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多