2016-12-27 2 views
0

У меня есть List типа DailySummaryGroupBy и SUM по пунктам списка с помощью LINQ

public class DailySummary 
{ 
    public string AffiliateID { get; set; } 
    public string TotalCalls { get; set; } 
    public string Date{ get; set; } 
} 

с следующими данными выборки:

List<DailySummary> DealerTFNDatesTable = new List<DailySummary>(); 
DealerTFNDatesTable.Add(new DailySummary() { AffiliateID="0", Date = "12/12/2016", TotalCalls = "10"}); 
DealerTFNDatesTable.Add(new DailySummary() { AffiliateID="0", Date = "12/13/2016", TotalCalls = "74"}); 
DealerTFNDatesTable.Add(new DailySummary() { AffiliateID="1", Date = "12/22/2016", TotalCalls = "63"}); 
DealerTFNDatesTable.Add(new DailySummary() { AffiliateID="0", Date = "12/12/2016", TotalCalls = "58"}); 

Теперь я хочу, чтобы получить Date и TotalCalls сгруппированы по AffiliateID и назначить в другом списке.

for(int i =0; i < DealerTFNDatesTable.Count; i++) 
{ 
    List<NewList> newList = new List<NewList>(); 
    newList.Date = //Assign Dintinct dates WHERE AffiliateId = 0 
    newList.AffiliateID = //AffiliateID=0 
    newList.TotalCalls= //TotalCalls SUM GROUPBY DATE and AffiliateID = 0 
         //For Date '12/12/2016' it will be 68, For '12/13/2016' it will be 74 and so on 
} 

Извините, я новичок в LINQ. Может ли кто-нибудь помочь мне или поделиться ресурсами, где я могу получить намек на это?

ответ

2

Это должно работать для группировки по AffilateID и дата, а затем получить сумму (хотя это странно, сохранить номер в виде строки на что-то вроде этого, но все, что плывет лодка).

var results = DealerTFNDatesTable 
    .GroupBy(x => new { x.AffiliateID, x.Date }) 
    .Select(x => new DailySummary { 
     AffiliateID = x.First().AffiliateID, 
     Date = x.First().Date, 
     TotalCalls = x.Sum(y => Convert.ToInt32(y.TotalCalls)).ToString() 
    }); 

Если вы теперь посмотрите на результат, например, с помощью этого кода, вы получите точно значения, которые вы хотели:

foreach (var x in results) { 
    Console.WriteLine($"id = {x.AffiliateID}, date = {x.Date}, totalCalls = {x.TotalCalls}"); 
} 

> id = 0, date = 12/12/2016, totalCalls = 68 
> id = 0, date = 12/13/2016, totalCalls = 74 
> id = 1, date = 12/22/2016, totalCalls = 63 
+0

Идеальное и простое решение. Большое спасибо :) –

0
var results = DealerTFNDatesTable.GroupBy(T => new { T.AffiliateID }) 

Link

+1

Хотя этот фрагмент кода может решить вопрос, [включая объяснение] (// meta.stackexchange.com/questions/114762/explaining-entirely-code-based-answers) действительно помогает улучшить качество вашего сообщения. Помните, что вы отвечаете на вопрос читателей в будущем, и эти люди могут не знать причин вашего предложения кода. Также попробуйте не толковать код с пояснительными комментариями, что уменьшает читаемость кода и объяснений! – kayess

0

Во-первых,

Поскольку DealerTFNDatesTable является переменной, вы должен использовать чехол для верблюда. Таким образом, это dealerTFNDatesTable

Затем, чтобы завершить @andy его ответ, как вы также хотите сделать выбор. Вы можете выбрать его следующим образом:

 var newVariable = from item in dealerTFNDatesTable 
        group item by new 
        { 
         item.Date, 
         item.AffiliateID, 
        } 
        into g 
        select new 
        { 
         Date = g.Key.Date, 
         Id = g.Key.AffiliateID, 
         Total = g.Sum(a => a.TotalCalls) 
        }; 

Это даст вам IEnumerable, из которых вы можете поместить соответствующие части в списке, делая var otherList = new List<object>(newVariable .Where(a => a.Total > 0)); или просто добавить .ToList() после того, как выбрать, если вы хотите коллекцию как есть.

Обратите внимание, что это просто другое обозначение, отличное от LINQ, результат тот же.

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