Добавить пропущенные значения в список в формах xamarin - PullRequest
1 голос
/ 02 июля 2019

У меня есть собственный список объектов, который имеет месяц и другое значение типа int. Я получаю этот список из базы данных. Таким образом, данные поступают из веб-службы как 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
    }
]

Ответы [ 2 ]

2 голосов
/ 02 июля 2019

Вы можете попробовать следующий подход,

  1. Выберите все месяцы (целое значение) из списка, используя Select

      var months = NewDataList.Select(x => x.MONTH); // This will give you all integers i.e MONTHs.
    
  2. Найдите Max() по месяцам и создайте Range от 1... maxMonths

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

Теперь у вас есть 2 списка, т. Е. months и oneToMaxMonths, используйте «За исключением», чтобы получить пропущенные месяцы из списка новых данных

var results = oneTomaxMonths.Except(months);

Результат по каждому элементу создайте новый экземпляр с NEW_REC_COUNT = 0

POC: .net Fiddle

1 голос
/ 02 июля 2019

Если у вас мало данных, вы можете попробовать пропустить loop и 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());
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...