我有下面的销售例子列表,显示了过去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。
发布于 2020-03-23 17:17:13
假设您有一个类代表您的月份:
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.Insert(Int32, T)是用于插入的O(N)。我们可以通过使用Dictionary<int, int>进行O(1)插入来改进这一点:
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进行排序,因为字典本质上是无序的。
在dotnetfiddle.net上试用
发布于 2020-03-23 17:18:22
试着尽可能接近你的模型
// 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
);https://stackoverflow.com/questions/60818016
复制相似问题