当前位置: 首页 > 知识库问答 >
问题:

LINQ-组通过,然后有条件地求和

曾河
2023-03-14

我有一个数据集(汽车):

Brand     DateSold    Amount  Bought/Sold
Toyota    06/07/2015  18.5    Bought
BMW       01/01/2016  25.15   Sold
Mercedes  06/06/2016  20.75   Bought  

我想按年份分组并返回金额的总和,即:

Year Amount  
2015 -18.5   
2016 4.4

并将其输出到列表框中。

我可以在没有买入/卖出条件的情况下求和:

var AmountsByYear = cars.GroupBy(i => i.Date.Year)
                        .Select(g => new { 
                            Year = g.Key,
                            Total = g.Sum(i => i.Amount)
                        }).ToList();
lstAmountsByYear.DataSource = AmountsByYear;

共有2个答案

虞修平
2023-03-14

考虑创建汽车的扩展方法,将[Amount ]的组合转换为 的正值或负值:

public static decimal ToProperAmountValue(this Car car)
{
    return car.IsCarBought ? -car.Amount : car.Amount;
}
// TODO: invent proper method name

此外,请使用已经为您执行选择的正确重载ENumable. GroupBy:

var amountsByYear = cars.GroupBy(

    // KeySelector: Group Cars into Groups of same year
    car => car.Date.Year)

    // ResultSelector: take the Key and the Cars with this Key to make a new object
    (year, carsInThisYear => new
    { 
        Year = year,
        Total = carsInThisYear.Sum(car => car.ToProperAmountValue())
    })
    .ToList();
牧梓
2023-03-14

由于您没有详细说明“买入/卖出”字段在数据结构中是如何定义的,我建议您使用枚举。例如,

public class Car
{
    public string Brand;
    public DateTime Date;
    public double Amount;
    public BusinessType BusinessType;
}

public enum BusinessType
{
    Bought = -1,
    Sold = 1
}

这将使您能够以最小的更改使用查询,如下所示,以获得预期结果。

var AmountsByYear = cars.GroupBy(i => i.Date.Year)
                    .Select(g => new { 
                        Year = g.Key,
                        Total = g.Sum(i => i.Amount*(int)i.BusinessType)
                    }).ToList();

输入数据,

var cars = new List<Car>
{
    new Car{Brand="Toyota", Date = new DateTime(2015,06,07),Amount=18.5,BusinessType=BusinessType.Bought},
    new Car{Brand="BMW", Date = new DateTime(2016,01,01),Amount=25.15,BusinessType=BusinessType.Sold},
    new Car{Brand="Mercedes", Date = new DateTime(2016,06,06),Amount=20.75,BusinessType=BusinessType.Bought},
};

输出

 类似资料:
  • 问题内容: 我有一个像这样的数组: 现在,我想按某种条件过滤该数组,只保留值等于2的元素,并删除值不等于2的所有元素。 所以我的预期结果数组将是: 注意:我想保留原始数组中的键。 如何使用PHP做到这一点?有内置功能吗? 问题答案:

  • 对于在其生命周期的某个点隐藏的组件,呈现它的最佳方式是什么?1)渲染组件,但不显示它(显示:无)。2)只在需要时渲染组件。什么对性能更好?如果组件的道具和状态稍后更新,是否最好让组件存在,但隐藏在虚拟DOM中? 或者这个:

  • 我有两个PrimeFaces SelectOne菜单组件。当第一个组件设置为某个值时,我需要第二个组件成为必需的。我使用Ajax和绑定在提交第一个组件时更新第二个组件,以便用户在第二个组件的标签旁边看到所需的“*”。那部分很简单。 以下是(稍微简化的)代码: 它工作正常,但以下情况除外: 用户从foo中选择值1。结果:Bean用foo更新 显然,这是工作,因为它应该每个JSF。然而,我担心这会导致

  • 本文向大家介绍怎样有条件地渲染组件?相关面试题,主要包含被问及怎样有条件地渲染组件?时的应答技巧和注意事项,需要的朋友参考一下 or

  • 像这样,我想通过linq获得who行

  • 问题内容: 我有一个组件,有时有时需要呈现为和,有时需要呈现为。在我读来确定这一点,是。 如果存在,则需要将组件包装在中。否则,它将仅呈现为。 可能? 这是我现在正在做的,但是感觉可以简化: 更新: 这是最终的锁定。感谢您的提示,@ Sulthan! 问题答案: 只需使用一个变量。 或者,您可以使用辅助函数来呈现内容。JSX和其他代码一样。如果要减少重复,请使用函数和变量。