阵列上的LINQ过滤器

时间:2014-01-08 23:09:13

标签: c# .net linq c#-4.0

public class Feature
{
    public string Id { get;  set; }
    public string Description { get;  set; }
    public decimal Class { get;  set; }
    public decimal Price { get;  set; }
}

我有一个Feature[]数组。现在,当我有一个填充数组列表时,我想:

  1. 通过移除Price = 0的任何项来过滤arraylist。
  2. 如果[Id][Class]相同,我想要总结这些商品的价格并显示为单个商品。
  3. 如何使用LINQ实现这一目标?

1 个答案:

答案 0 :(得分:7)

试试这个:

Feature[] features = ...
var results =
    from f in features
    where f.Price != 0
    group f by new { f.Id, f.Class } into g
    select new Feature 
    {
        Id = g.Key.Id,
        Class = g.Key.Class,
        Description = g.First().Description,
        Price = g.Sum(f => f.Price)
    };

或者用流利的语法:

var results = features
    .Where(f => f.Price != 0)
    .GroupBy(f => new { f.Id, f.Class })
    .Select(g => new Feature 
        {
            Id = g.Key.Id,
            Class = g.Key.Class,
            Description = g.First().Description,
            Price = g.Sum(f => f.Price)
        });

请注意,这会生成一组全新的Feature个对象,与原始对象完全无关。另请注意,此处可能不需要过滤f.Price != 0;如果价格实际为0,则无论如何它都不会显示在总和中。唯一的区别是,如果您没有过滤掉f.Price != 0,那么该组中所有Feature的价格为0的组都会出现在结果集中。