开发者

List.GroupBy<> error using LInq

I'm trying to group a generic List<> in C#. The code compiles, but the application (Silverlight) throws the following error (CharOpps is the class of objects in the list I'm trying to group):

Unhandled Error in Silverlight Application Unable to cast object of type 'Grouping[System.DateTime,Invoc_SalesDa开发者_JAVA百科shboard.ChartOpps]' to type 'Invoc_SalesDashboard.ChartOpps'.

Here's the code:

var newtemplist = list.GroupBy(opp =>
                        new DateTime(opp.EstimatedCloseDate.Year, opp.EstimatedCloseDate.Month, 1)).OrderBy(opp => opp.Key);

I've also tried:

                        var newtemplist =
                        from opp in list
                        orderby opp.EstimatedCloseDate
                        group opp by new { opp.EstimatedCloseYear, opp.EstimatedCloseMonth }; 

ChartOpps have a revenue value, and the EstimatedCloseDate value. What I'm hoping to end up with is a list of ChartOpps with the revenue aggregated in the year/month groupings.

                        foreach (ChartOpps c in newtemplist)
                    {
                        ErrorBox.Text += "o";
                    }


You're not showing us what you're doing with the result newtemplist. The runtime error message indicates that you are taking a group and trying to treat it as an instance of ChartOpps which is clearly impossible. Show us that code and we can help you fix it.

Edit:

Okay, now the problem is clear. To enumerate the results of the grouping, you need to proceed as follows:

foreach(var group in newtemplist) {
    foreach(ChartOpps c in group) {
        // do something with c here
    }
}

The result of newtemplist is a sequence of sequences, each sequence having all of its elements having the same value of new DateTime(opp.EstimatedCloseDate.Year, opp.EstimatedCloseDate.Month, 1). Therefore, to enumerate this sequence of sequences, you first have to enumerate the groups, and then within each group enumerate the instances of ChartOpps.


Not knowing anything about your class structure, here is a basic attempt:

List<CharOpps> list = GetList();

var newtemplist =
    from opp in list
    group opp by opp.EstimatedCloseYear into g
    select new { g = g.Key, CharOpps = g };


If you take the var out of the picture, it all becomes clear.

IEnumerable<IGrouping<DateTime, ChartOpps>> newtemplist = list
  .GroupBy(opp => new DateTime(
     opp.EstimatedCloseDate.Year,
     opp.EstimatedCloseDate.Month,
     1))
  .OrderBy(opp => opp.Key); 


foreach (ChartOpps c in newtemplist) 
{ 
  ErrorBox.Text += "o"; 
} 

The error occurs in the assignment of the first element of newtemplist to c. c is allowed to reference ChartOpps instances. The first element of newtemplist is a IGrouping<DateTime, ChartOpps>, not a ChartOpps. The implicit cast in the foreach fails and you get a runtime exception.

Try instead:

foreach(IGrouping<DateTime, ChartOpps> g in newtemplist)
{
  foreach (ChartOpps c in g) 
  { 
    ErrorBox.Text += "o"; 
  } 
}
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜