2013-10-02 7 views
1

У меня есть класс:Sum Список объектов с помощью Linq

public Class MyClass 
{ 
    public string name {get;set;} 
    public double quantity {get; set;} 
    public double price {get; set;} 
    public double value {get; set;} 
    public string id1 {get; set;} 
    public string id2 {get; set;} 
} 


List<MyClass> myList = new List<MyClass>(); 

список объектов затем заполняется, но то же имя может иметь несколько записей. Например, вот мой обзор списка:

[0] "stock A", 200.0, 20.0, 4000, "aa", "bb" 
[1] "stock A", 400.0, 20.0, 8000, "aa", "bb" 
[2] "stock B", 200.0, 20.0, 4000, "cc", "dd" 
[3] "stock A", 200.0, 19, 3800, "aa", "bb" 
[4] "stock C", 200.0, 20.0, 4000, "ee", "ff" 

В настоящее время у меня есть следующий код:

var groupedStockList = (from t in myList 
    group t by new { t.name, t.price } 
    into grp 
    select new 
    { 
     grp.Key.name, 
     grp.Key.price, 

     Quantity = grp.Sum(x => x.quantity) 
    }).ToList(); 

В результате, со А сгруппированы, но 2 группы по 2 комплекта цен, поэтому у меня есть группа из 600 акций A по цене 20 и 200 акций по цене 19.

Я думал, что мне нужно пойти со средней ценой, то есть sum = (quantity * price)/total_quantity, но я потерял, как включить это в linq.

Есть ли у кого есть подход к этому, кто может помочь? Я хотел бы сохранить идентификаторы 1 и 2 также в списке и просто сортировать по имени.

Спасибо.

EDIT

Что я хотел бы вернуться в это,

[0] "stock A", 800, 19.75, 15800, "aa", "bb" 
[1] "stock B", 200.0, 20.0, 4000, "cc", "dd" 
[2] "stock C", 200.0, 20.0, 4000, "ee", "ff" 
+1

Будьте в курсе, что вы хотите вернуть. «Обзор списка», например, был бы хорош ... –

+0

ОК, я добавлю его сейчас – Timujin

+0

Можете ли вы опубликовать код, который заполняет список? –

ответ

5

попробовать этот

var groupedStockList = (from t in myList 
    group t by new { t.name, t.id1, t.id2 } into grp 
    select new 
    { 
     Name = grp.Key.name, 
     TotalQuantity = grp.Sum(x => x.quantity), 
     AvgPrice = grp.Sum(x => x.value)/grp.Sum(x => x.quantity), 
     TotalValue = grp.Sum(x => x.value), 
     Id1 = grp.Key.id1, 
     Id2 = grp.Key.id2  
    }).ToList(); 
+0

Действительно, СПАСИЮ ДЛЯ ЭТОГО !!!!! – Timujin

+0

В любое время, спасибо редакторам, которые исправили некоторые опечатки :) –

0

Для чего это стоит это модификация this other answer с использованием синтаксиса метода, в отличие от синтаксис запроса

var result = myList.GroupBy(x => {x.name, x.id1, x.id2}) 
        .Select(g => new { 
             Name = grp.Key.name, 
             TotalQuantity = grp.Sum(x => x.quantity), 
             AvgPrice = grp.Average(x => x.price), 
             TotalValue = grp.Sum(x => x.value), 
             Id1 = grp.Key.id1, 
             Id2 = grp.Key.id2  
            }) 
        .ToList(); 
+1

Когда вы берете другой ответ и используете большие его части, чтобы написать свой собственный ответ, даже если вы его немного измените, вам нужно привести его, иначе это плагиат. – Servy

+0

Отмечено. Я не пытался сорвать другой ответ, просто подумал, что это действительная альтернатива. – NinjaNye

+0

Что хорошо делать, вам просто нужно привести ответ. – Servy

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