首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何从一年内的月份列表中找出缺少的月份

如何从一年内的月份列表中找出缺少的月份
EN

Stack Overflow用户
提问于 2020-03-23 16:51:13
回答 2查看 584关注 0票数 1

我有下面的销售例子列表,显示了过去12个月里赚了多少钱,少了2个月(可以是或多或少)。

代码语言:javascript
运行
复制
[{1, 400}, {2,500}, {4, 550}, {5, 425}, {6, 770}, {7, 500}, {9, 300}, {10, 900}, {11, 440}, {12, 620}]

月份按升序排列,因此1为1月,12为12,我如何在代码中更新此列表,以添加值为0的缺失月份的销售对象。在本例中,添加{3, 0}{8, 0}

我从数据库中检索这些数据,其中一些缺失的原因是它们在数据库中没有记录,因此我希望在缺少的月份中添加零。这个月来自DateTime.Date.Month

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-03-23 17:17:13

假设您有一个类代表您的月份:

代码语言:javascript
运行
复制
public class MonthData
{
    public int Month { get; set; }
    public int Money { get; set; }
}

然后可以使用LINQ查找缺少的月份,然后将它们插入原始列表中:

代码语言:javascript
运行
复制
var months = new List<MonthData>
{
    new MonthData {Month = 1, Money = 400},
    new MonthData {Month = 2, Money = 500},
    new MonthData {Month = 4, Money = 550},
    new MonthData {Month = 5, Money = 425},
    new MonthData {Month = 6, Money = 770},
    new MonthData {Month = 7, Money = 500},
    new MonthData {Month = 9, Money = 300},
    new MonthData {Month = 10, Money = 900},
    new MonthData {Month = 11, Money = 440},
    new MonthData {Month = 12, Money = 620}
};

# Find missing months
var missingMonths = Enumerable
    .Range(months.Min(m => m.Month), months.Max(m => m.Month))
    .Except(months.Select(m => m.Month))

# Insert missing months back into months list
foreach (var month in missingMonths)
{
    months.Insert(month - 1, new MonthData { Month = month, Money = 0 });
}

另外,List.Insert(Int32, T)是用于插入的O(N)。我们可以通过使用Dictionary<int, int>进行O(1)插入来改进这一点:

代码语言:javascript
运行
复制
var months = new Dictionary<int, int>
{
    {1, 400},
    {2,500},
    {4, 550},
    {5, 425},
    {6, 770},
    {7, 500},
    {9, 300},
    {10, 900},
    {11, 440},
    {12, 620}
};

var missingMonths = Enumerable
    .Range(months.Keys.Min(), months.Keys.Max())
    .Except(months.Keys);

foreach (var month in missingMonths)
{
    months[month] = 0;
}

并且还可以选择返回到List<MonthData>中:

代码语言:javascript
运行
复制
var monthList = months
    .Select(pair => new MonthData { 
        Month = pair.Key, 
        Money = pair.Value 
    })
    .OrderBy(m => m.Month)
    .ToList();

这需要O(NLogN)Enumerable.OrderBy进行排序,因为字典本质上是无序的。

dotnetfiddle.net上试用

票数 2
EN

Stack Overflow用户

发布于 2020-03-23 17:18:22

试着尽可能接近你的模型

代码语言:javascript
运行
复制
// Example
var yearSales = new Dictionary<int, decimal>
{
    {  1, 100 },
    {  3, 300 },
    {  6, 600 },
};

// Actual logic
var fullMonths = Enumerable.Range(1, 12)
    .ToDictionary(
        month => month,
        month => yearSales.TryGetValue(month, out decimal d) ? d : default
    );
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60818016

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档