我在下面的示例销售清单中显示了过去12个月内赚了多少钱,而2个月都没有了(可以或多或少)。
[{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
。
假设您有一个代表您月份的课程:
public class MonthData
{
public int Month { get; set; }
public int Money { get; set; }
}
然后,您可以使用LINQ查找丢失的月份,然后将其插入原始列表中:
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<T>.Insert(Int32, T)
是O(N)。我们可以通过Dictionary<int, int>
为O(1)插入使用a来改善此问题:
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>
行:
var monthList = months
.Select(pair => new MonthData {
Month = pair.Key,
Money = pair.Value
})
.OrderBy(m => m.Month)
.ToList();
由于字典本质上是无序的,因此需要使用O(NLogN)进行排序Enumerable.OrderBy
。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句