web-dev-qa-db-fra.com

Linq Select Group By

J'ai la structure de classe suivante:

public class PriceLog
{
   public DateTime LogDateTime {get; set;}
   public int Price {get; set;}
}

Pour un List <PriceLog> je veux qu'une requête Linq génère une sortie équivalente aux données représentées comme ci-dessous:

LogDateTime | AVG (Prix)
Janv. 2012 | 2000
Fév 2012 | 3000

Simplement: je veux calculer le prix moyen sur chaque mois de l'année.
Remarque: la propriété LogDateTime doit être formatée comme LogDateTime.ToString("MMM yyyy")

J'ai essayé ce qui suit, mais je ne sais pas si cela générera le résultat souhaité:

var result = from priceLog in PriceLogList
                         group priceLog by priceLog.LogDateTime.ToString("MMM yyyy") into dateGroup
                         select new PriceLog { GoldPrice = (int)dateGroup.Average(p => p.GoldPrice), SilverPrice = (int)dateGroup.Average(p => p.SilverPrice)};
10
Lucifer

Cela vous donnera une séquence d'objets anonymes, contenant une chaîne de date et deux propriétés avec un prix moyen:

var query = from p in PriceLogList
            group p by p.LogDateTime.ToString("MMM yyyy") into g
            select new { 
               LogDate = g.Key,
               AvgGoldPrice = (int)g.Average(x => x.GoldPrice), 
               AvgSilverPrice = (int)g.Average(x => x.SilverPrice)
            };

Si vous devez obtenir la liste des objets PriceLog:

var query = from p in PriceLogList
            group p by p.LogDateTime.ToString("MMM yyyy") into g
            select new PriceLog { 
               LogDateTime = DateTime.Parse(g.Key),
               GoldPrice = (int)g.Average(x => x.GoldPrice), 
               SilverPrice = (int)g.Average(x => x.SilverPrice)
            };
21
Sergey Berezovskiy
    from p in PriceLog
    group p by p.LogDateTime.ToString("MMM") into g
    select new 
    { 
        LogDate = g.Key.ToString("MMM yyyy"),
        GoldPrice = (int)dateGroup.Average(p => p.GoldPrice), 
        SilverPrice = (int)dateGroup.Average(p => p.SilverPrice) 
    }
3
MuhammadHani

Vous devriez l'essayer comme ceci:

var result =
        from priceLog in PriceLogList
        group priceLog by priceLog.LogDateTime.ToString("MMM yyyy") into dateGroup
        select new {
            LogDateTime = dateGroup.Key,
            AvgPrice = dateGroup.Average(priceLog => priceLog.Price)
        };
3
amartine
var result = priceLog.GroupBy(s => s.LogDateTime.ToString("MMM yyyy")).Select(grp => new PriceLog() { LogDateTime = Convert.ToDateTime(grp.Key), Price = (int)grp.Average(p => p.Price) }).ToList();

Je l'ai converti en int car mon champ Price était int et la méthode Average retourne double. J'espère que cela vous aidera

1
yo chauhan