LINQ lambda OrderByDescending on group by key.count()返回按键分组的字符串列表,用于图表图例排序

Ale*_*oni 0 c# linq asp.net-mvc lambda

试图在MVC 4 C#中对饼图的图例进行排序.该图表显示按商品编号销售的产品数量.在图例中,我想显示项目编号,然后显示已售出的编号,然后显示已售出的百分比,并按销售的数量按降序排序.

我已经得到了"Y"值(#已售出)以便正确订购,但在尝试订购"X"值时,它们最终混乱并且与其正确的"Y"值不匹配.

在我看来,我应该只需要按项目编号对数据进行分组,然后按项目编号的匿名类型和项目编号的数量选择数据,然后根据项目编号计数降序排序,然后再次选择此时间现在以正确的顺序获取项目编号的列表字符串.

上述工作正常运行是合理的,而问题更多的是我几乎完全不了解该DataBindXY方法在图表中的工作原理.

码:

var data = srv.GetTSMMetricData(Mode, Territories, selectedTerritory).GroupBy(x => x.ItemNumber).ToList();

var xValues = data.Select(x => x.Key).OrderByDescending(x => x.Count()).ToList();

mySeries.Points.DataBindXY(xValues, data.Select(x => x.Count()).OrderByDescending(x => x).ToList());
Run Code Online (Sandbox Code Playgroud)

任何正确方向的帮助或推动都会很棒.如果还有其他任何我可以发布的内容可能会丢失,请告诉我.

谢谢.

编辑:忘了我试图在以上版本的上述代码中使用匿名类型..

var xValues = data.Select(x => new { Item = x.Key, Count = x.Key.Count() }).OrderByDescending(x => x.Count).ToList();

mySeries.Points.DataBindXY(xValues.Select(x => x.Item).ToList(), data.Select(x => x.Count()).OrderByDescending(x => x).ToList());
Run Code Online (Sandbox Code Playgroud)

编辑2:当前结果示例(前5个图例条目)..

ItemNumber - # Sold - % Sold ----- Correct ItemNumber for # Sold
-------------------------------------------------------------
8500         42       (20.79)%     PRS
JOL          19       (9.41)%      JOL
280          18       (8.91)%      ENV
171          13       (6.44)%      AMR
172          12       (5.94)%      GRD

Note: 38 rows of total results
Run Code Online (Sandbox Code Playgroud)

结果具有查询的所有正确ItemNumbers和所有#Sold但不匹配ItemNumbers到正确的#Sold.我可以重新编写代码,以便ItemNumbers和#Sold匹配,但只按ItemNumber排序,我真的想按#Sold订购.希望这能让我们更清楚问题是什么以及我希望看到的是什么.

Ger*_*old 5

我认为通过排序两次,你会混淆键和值的顺序.

确保首先创建正确排序的对列表:

var data = srv.GetTSMMetricData(Mode, Territories, selectedTerritory)
           .GroupBy(x => x.ItemNumber)
           .Select( x => new
                        {
                            ItemNumber = x.Key,
                            Count = x.Count()
                        } )
           .OrderByDescending(x => x.Count)
           .ToList();
Run Code Online (Sandbox Code Playgroud)

然后做绑定:

mySeries.Points.DataBindXY(data.Select(x => x.ItemNumber)
                          ,data.Select(x => x.Count));
Run Code Online (Sandbox Code Playgroud)