[英]Add missing values to a list in xamarin forms
我有一个自定义对象列表,其中包含月份和另一个int值。 我从数据库中获取此列表。 因此,来自Web服务的数据为JSON。 有时月份不是连续的。 有时一些月会失踪。 例如,如果这是第7个月,
然后列表中的月份可能包含这样的内容。 {1,2,3,6,7}
所以我想补充4,5的遗漏月份---- {1,2,3,4,5,6,7}
其他值应为0(NEW_REC_COUNT)
我的对象类
public class NewData
{
public int MONTH { get; set; }
public int NEW_REC_COUNT { get; set; }
}
示例Json
[
{
"MONTH": 1,
"NEW_REC_COUNT": 19
},
{
"MONTH": 2,
"NEW_REC_COUNT": 5
},
{
"MONTH": 3,
"NEW_REC_COUNT": 2
},
{
"MONTH": 6,
"NEW_REC_COUNT": 9
},
{
"MONTH": 7,
"NEW_REC_COUNT": 3
}
]
您可以尝试以下方法,
使用Select
从列表中选择所有月份(int值)
var months = NewDataList.Select(x => x.MONTH); // This will give you all integers ie MONTHs.
从几个月中查找Max()
并从1... maxMonths
创建范围
var maxMonths = months.Max(); var oneTomaxMonths = Enumerable.Range(1,maxMonths).ToList();
现在你已经2所列出,即months
和oneToMaxMonths
,使用除来自新数据的清单得到失踪月
var results = oneTomaxMonths.Except(months);
Foreach结果使用NEW_REC_COUNT = 0
创建新实例
POC: .net小提琴
如果没有大量的数据,你可以尝试smiple 环和Insert
省略的项到列表:
List<NewData> list = ...
// If list is not guarantee to be sorted
list.Sort((a, b) => a.MONTH.CompareTo(b.MONTH));
for (int i = 0; i < list.Count - 1; ++i) {
NewData current = list[i];
NewData next = list[i + 1];
// Do we have a hole at position i + 1?
if (current.MONTH + 1 < next.MONTH) {
list.Insert(i + 1, new NewData() {
MONTH = current.MONTH + 1, // Omitted month
NEW_REC_COUNT = 0, // Default value
});
}
}
编辑:如果我们想要从1
开始的月份,包括当前月份( DateTime.Today.Month
),我们可以使用Linq :
using System.Linq;
...
List<NewData> list = ...
// Let's generalize a bit if you want, say Q3 period
int fromMonth = 1;
int upToMonth = DateTime.Today.Month; // or 7 for testing
list = Enumerable
.Range(fromMonth, upToMonth - fromMonth + 1)
.Select(month =>
list.FirstOrDefault(item => item.MONTH == month)
?? new NewData() { MONTH = month, // Omitted month
NEW_REC_COUNT = 0 }) // Default value
.ToList();
如果要修改现有 list
:
list.AddRange(Enumerable
.Range(fromMonth, upToMonth - fromMonth + 1)
.Where(month => !list.Any(item => item.MONTH == month))
.Select(month => new NewData() {
MONTH = month,
NEW_REC_COUNT = 0 })
.ToArray());
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.