Linq group按类的特定属性然后取最小值和最大值

时间:2016-12-25 16:31:17

标签: c# asp.net asp.net-mvc linq group-by

我已经定义了这样一个类:

 public class GroupedItem
{
    public DateTime _Date { get; set; }
    public int Sales { get; set; }
    public float TransactionPrice { get; set; }

    public string Seller { get; set; }

    // Part used for calculation
    public float BestSellerAveragePrice { get; set; }
    public float MinPrice { get; set; }
    public float MaxPrice { get; set; }
}

然后我填写了一个GroupedItem类型列表,如下所示:

List<GroupedItem> _groupedItems = new List<GroupedItems>();

让我们说这个列表有300个项目,其唯一的初始值是前四个属性,如上所述。具有最小,最高和平均价格的部分我将按照以下语句分组填写:

ViewBag.PriceAnalytics = _groupedItems.GroupBy(x => x.Seller).Select(gi => new GroupedItem() { MinPrice = x. }).ToList();

正如您所看到的那样,我按卖家属性进行分组,以便为​​销售某些商品的用户以特定价格获得所有销售。

我想要做的是首先将他们卖出的所有价格加起来,然后取出最小值和最大值。因此,如果输入值为:

Seller Mike, 21.12.2016, 1 sale, 48$
Seller Mike, 21.12.2016, 1 sale, 24$
Seller Mike, 21.12.2016, 1 sale, 29$


Seller Jenna, 21.12.2016, 1 sale, 20$
Seller Jenna, 21.12.2016, 1 sale, 39$
Seller Jenna, 21.12.2016, 1 sale, 56$

Seller Josh, 21.12.2016, 1 sale, 10$
Seller Josh, 21.12.2016, 1 sale, 28$
Seller Josh, 21.12.2016, 1 sale, 39$

所需的输出是:

Seller Mike, 21.12.2016, 3 sales, 101$
Seller Jenna, 21.12.2016, 3 sales, 115$
Seller Josh, 21.12.2016, 3 sales, 77$

在第一组之后......现在我会把所有卖家和他们的总销售额与他们的总收入相比。

现在我需要对这三个值做些什么:

101, 115, 77 

最低价格为77美元,最高价格为115美元

如何使用LINQ做到这一点?

2 个答案:

答案 0 :(得分:1)

您还可以使用LINQ查询获取汇总数据列表:

var data = (from gp in test
            group gp by gp.Seller into g
            select new GroupedItem
            {
                Seller = g.Key,
                _Date = g.First()._Date,
                Sales = g.Sum(x => x.Sales),
                TransactionPrice = g.Sum(x => x.TransactionPrice)
            }).ToList();
var best = data.Max(x => x.TransactionPrice);
var worst = data.Min(x => x.TransactionPrice);

答案 1 :(得分:0)

你几乎在那里,在对卖家进行分组后,你需要逐个处理每个小组,见:

List<GroupedItem> result = new List<GroupedItem>();
var groupedResult = _groupedItems.GroupBy(x=>x.Seller);

foreach(var grouping in groupedResult)
{

    var row = grouping.First();

    row.TransactionPrice = grouping.Sum(x=>x.TransactionPrice);
    row.Sales = grouping.Sum(x=>x.Sales);

    result.Add(row);
}

DEMO FIDDLE