2014-01-08 2 views
1
public class Feature 
{ 
    public string Id { get; set; } 
    public string Description { get; set; } 
    public decimal Class { get; set; } 
    public decimal Price { get; set; } 
} 

У меня есть массив Feature[]. Теперь, когда у меня есть заполненный список массива, я хочу:LINQ фильтр на массиве

  1. фильтра в ArrayList путем удаления любого элемента с Price = 0.
  2. И если [Id] и [Class] одинаковы, я хочу подвести цену для этих предметов и отобразить ее как отдельный элемент.

Как достичь этого с помощью LINQ?

ответ

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, группы, в которых цены равны 0 для всех Feature в этой группе, в результирующем наборе.

Смежные вопросы