C#从groupby改变

时间:2017-05-12 02:27:51

标签: c# linq group-by

假设Myclass中有两个属性:DateSymbol 我想经常在这两个属性之间进行转换,但我发现了 List <Myclass> vector 如果我使用

vector.groupby(o => o.Date).Select(o => o)

vector不再是List<IGrouping<string, Myclass>>

的类型

如果我想将groupby(o => o.Date)转换为groupby(o => o.Symbol) 我必须使用

vector.groupby(o => o.Date).Selectmany(o => o).groupby(o => o.Symbol)

我尝试使用SortedList<Date, Myclass>,但我不熟悉SortedList(实际上,我不知道SortedListGroupby之间有什么区别。 是否有任何有效的方法来实现这种效果,因为我高度依赖于跑步的速度?

int volDay = 100;
Datetime today = new DateTime(2012, 1, 1);

//choose the effective database used today, that is the symbol with data more than volDay
var todayData = dataBase.Where(o => o.Date <= today).OrderByDescending(o => o.Date)
                .GroupBy(o => o.Symbol).Select(o => o.Take(volDay))
                .Where(o => o.Count() == volDay).SelectMany(o => o);

//Select symbols we want today
var symbolList = todayData
                .Where(o => o.Date == today && o.Eqy_Dvd_Yld_12M > 0))
                .OrderByDescending(o => o.CUR_MKT_CAP)
                .Take((int)(1.5 * volDay)).Where(o => o.Close > o.DMA10)
                .OrderBy(o => o.AnnualizedVolatility10)
                .Take(volDay).Select(o => o.Symbol).ToList();

//Select the database again only for the symbols in symbolList
var portfolios = todayData.GroupBy(o => o.Symbol)
               .Where(o=>symbolList.Contains(o.Key)).ToList();

这是我的真实代码,dataBase是总数据,我将逐日运行循环(这里只是固定的一天)。最后一个列表portfolios是我想要获得的最终目标,您可以忽略其他属性,这些属性用于DateSymbol

集合下的选择

1 个答案:

答案 0 :(得分:0)

如果您执行了.Distinct()

,它可能会更快,或者至少更容易阅读

获得不同的Date

var distinctDates = vector.Select(o => o.Date).Distinct()

获得不同的Symbol

var distinctSymbols = vector.Select(o => o.Symbol).Distinct()

我问你想要完成什么,以便我能为你提供一个有用的答案。你需要两个价值观吗?例如,一组独特的符号和日期?您应该只需要一个group by语句,具体取决于您最终要实现的目标。

例如,如果您想要按多个属性进行分组并跟踪两个独特的数据,则此问题Group By Multiple Columns将是相关的。分组后.Distinct()仍应有效。