如何在没有多个ToList的单个列表对象中获取前N条记录并添加剩余记录值?



我有一个像这样的类:

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();

}

现在我要做的是创建一个结果,如下所示:

  1. 取前2

  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)

最新更新