簡體   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