如何使用LINQ获取所有不同值的总和

时间:2018-05-20 16:47:16

标签: c# linq

我有ComboUniqueId这个基础我想要ComboAmount,我的问题是如何在ComboAmount基础上获得明确的ComboUniqueId请帮助我,我的代码如下:

ComboUniqueId是字符串

decimal FinalTotal = 0;

var ListUnique = this.OrderDetailArr.Select(x => new {
    ComboAmount = x.ComboAmount,
    ComboId = x.ComboId,
    ComboUniqueId = x.ComboUniqueId,
    ItemAddOnsArr = x.ItemAddOnsArr,
    TotalPrice =  x.TotalPrice
}).Distinct(x=> x.ComboUniqueId);

for (int i = 0; i < ListUnique.Length; i++)
{
    FinalTotal += ListUnique[i].TotalPrice;
    if(ListUnique[i].ComboId != null)
    {
        FinalTotal = ListUnique[i].ComboAmount;
    }
    if (ListUnique[i].ItemAddOnsArr != null)
    {
        for (int g = 0; g < this.OrderDetailArr[i].ItemAddOnsArr.Length; g++)
        {
            FinalTotal += this.OrderDetailArr[i].ItemAddOnsArr[g].AddOnTotalPrice;
        }
    }
}

1 个答案:

答案 0 :(得分:0)

听起来像this.OrderDetailArr有重复项,你想要删除它们。

您可以使用类似于以下内容的代码执行此操作,而不是创建匿名对象:

var ListUnique = this.OrderDetailArr
    // Group on the ComboUniqueId, you'll get 1 key with multiple values for duplicates
    .GroupBy(m => m.ComboUniqueId)
    // By retrieving the First(), you're limiting your result set to 1 per the group
    .Select(m => m.First());

您的代码的其余部分应该正常运行。

这里没有必要创建一个新的匿名类型(.Select(.. => new {..}))因为你只是从源中提取属性,所以你也可以保留它。

如果你开始使用Distinct,那么你的对象类型需要EqualityComparer<T>,只需要查看对象的ComboUniqueId属性来比较相等,你然后可以按照原始代码在Distinct方法中使用它。请注意,它再次不适用于您的匿名类型。