我有一个像这样的类:
public class StatusTypeViewModel
{
public string Status { get; set; }
public int Stats { get; set; }
}
public List<StatusTypeViewModel> GetStatusData()
{
//linq query
}
public ActionResult Get()
{
var statusData = GetStatusData();
var topTwo = statusData.Take(2).ToList();
}
现在我要做的是创建一个结果,如下所示:
取前2
排除前2项,将所有"统计数据"相加;带有"杂项"的结果记录的属性;地位。
GetStatusData方法返回的数据:
Status Stats
A 2
B 4
C 6
D 8
最终结果:
Status Stats
A 2
B 4
Miscellaneous 14
我担心的是我现在正在做多个ToList,可能希望在一个循环中或以更优雅的方式来做它,而不是做多个.ToList()
我将非常感谢你的帮助。
下面的代码可以工作。不过,它分为两部分完成。
var statuses = new List<StatusTypeViewModel> {
new StatusTypeViewModel { Status = "A", Stats = 2},
new StatusTypeViewModel { Status = "B", Stats = 4},
new StatusTypeViewModel { Status = "C", Stats = 6},
new StatusTypeViewModel { Status = "D", Stats = 8},
};
var misc = new StatusTypeViewModel {
Status = "Miscellaneous",
Stats = statuses.Skip(2).Sum(s => s.Stats)
};
var result = statuses.Take(2).Concat(new[] { misc });
您也可以使用GroupBy
,如下所示:
var misc = statuses.Skip(2)
.GroupBy(
s => 0, // give everything the same key, so just one group
s => s.Stats,
(key, stats) => new StatusTypeViewModel
{
Status = "Miscellaneous",
Stats = stats.Sum()
});
var result = statuses.Take(2).Concat(misc);
我个人觉得第一个版本更容易读。
在这两种情况下,如果您真的想在单个语句中完成它,您可以只内联misc
变量。不过,我还是觉得把它分开看更容易看。
您需要一个简单的linq语句
statusData.Skip (2) .Sum (x =比;x.Stats)