Если у вас есть класс, представляющий ваши месяцы:
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) :
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;
}
А также есть возможность go вернуться на List<MonthData>
вниз по линии :
var monthList = months
.Select(pair => new MonthData {
Month = pair.Key,
Money = pair.Value
})
.OrderBy(m => m.Month)
.ToList();
Требуется O (NLogN) * 1023 * сортировка с Enumerable.OrderBy
, так как словари неупорядочены по своей природе.
Попробуйте dotnetfiddle. net