繁体   English   中英

将缺少的值添加到xamarin表单中的列表中

[英]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
    }
]

您可以尝试以下方法,

  1. 使用Select从列表中选择所有月份(int值)

      var months = NewDataList.Select(x => x.MONTH); // This will give you all integers ie MONTHs. 
  2. 从几个月中查找Max()并从1... maxMonths创建范围

     var maxMonths = months.Max(); var oneTomaxMonths = Enumerable.Range(1,maxMonths).ToList(); 

现在你已经2所列出,即monthsoneToMaxMonths ,使用除来自新数据的清单得到失踪月

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM