Как добавить элементы для конкретного объекта данных во вложенный цикл в c #?

#c# #list #linq

#c# #Список #linq

Вопрос:

У меня есть объект данных, подобный приведенному ниже :

 public class RootObject
{ 
  public string ticker {get;set;}
  public List<Result> results {get;set;} 
}
  

и результирующий объект похож :

 {
  public double open {get;set;}
  public double close {get;set;}
}
  

Теперь каждый раз я буду получать несколько результатов для одного и того же тикера. Итак, я хочу добавить все результирующие элементы в один тикер. Вместо того, чтобы создавать его несколько раз в список.

 public static List<RootObject> minuteAggregateList = new List<RootObject>();
public void historicalMinuteAggData(string symbol)
        {
            int daysCount = 0;
            for(int i=1; i<=20; i  )
            {
                DateTime date = DateTime.Now.Date.AddDays(-i);
                if (date.DayOfWeek != DayOfWeek.Saturday amp;amp; date.DayOfWeek != DayOfWeek.Sunday)
                {
                    daysCount  ;
                    var startUnixTime = (date.Add(new TimeSpan(13, 30, 00)).Subtract(new DateTime(1970, 1, 1))).TotalMilliseconds;
                    var endUnixTime = (date.Add(new TimeSpan(20, 00, 00)).Subtract(new DateTime(1970, 1, 1))).TotalMilliseconds;
                    using (var reader = new StreamReader(new WebClient().OpenRead(string.Format("API For Fetch Data"))))
                    {
                        var x = reader.ReadLine();
                        RootObject data = JsonConvert.DeserializeObject<RootObject>(x);
                        minuteAggregateList.Add(data);
                    }
                }
                if (daysCount == 7)
                    break;
            }
        }
  

Прямо сейчас это дает нам несколько результатов для одного и того же тикера в minuteAggregateList. Как всегда, мне нужно, например, если AAPL есть в списке, а затем добавить новый элемент во вложенный результат AAPL. Итак, как сделать возможным добавление элементов во вложенную позицию под определенным тикером?

Комментарии:

1. Используйте словарь, делающий ключ уникальным элементом в тикере. Затем посмотрите, существует ли словарь. Для обработки нескольких элементов сделайте значение словаря объектом List().

Ответ №1:

из приведенного ниже кода вы сможете добавить список результатов в существующий список тиков, а также это позволит вам разместить список в выбранной вами позиции.

 public static List<RootObject> minuteAggregateList = new List<RootObject>();
public void historicalMinuteAggData(string symbol)
        {
            int daysCount = 0;
            for(int i=1; i<=20; i  )
            {
                DateTime date = DateTime.Now.Date.AddDays(-i);
                if (date.DayOfWeek != DayOfWeek.Saturday amp;amp; date.DayOfWeek != DayOfWeek.Sunday)
                {
                    daysCount  ;
                    var startUnixTime = (date.Add(new TimeSpan(13, 30, 00)).Subtract(new DateTime(1970, 1, 1))).TotalMilliseconds;
                    var endUnixTime = (date.Add(new TimeSpan(20, 00, 00)).Subtract(new DateTime(1970, 1, 1))).TotalMilliseconds;
                    using (var reader = new StreamReader(new WebClient().OpenRead(string.Format("API For Fetch Data"))))
                    {
                        var x = reader.ReadLine();
                        RootObject data = JsonConvert.DeserializeObject<RootObject>(x);
                        if (chk != null)
                        {
                            minuteAggregateList.Single(q => q.ticker == symbol).results.InsertRange(0, data.results);
                        }
                        else
                            minuteAggregateList.Add(data);
                    }
                }
                if (daysCount == 7)
                    break;
            }
        }
  

Ответ №2:

перед добавлением данных в список необходимо проверить одинаковое значение тикера.

 public static List<RootObject> minuteAggregateList = new List<RootObject>();
public void historicalMinuteAggData(string symbol)
        {
            int daysCount = 0;
            for(int i=1; i<=20; i  )
            {
                DateTime date = DateTime.Now.Date.AddDays(-i);
                if (date.DayOfWeek != DayOfWeek.Saturday amp;amp; date.DayOfWeek != DayOfWeek.Sunday)
                {
                    daysCount  ;
                    var startUnixTime = (date.Add(new TimeSpan(13, 30, 00)).Subtract(new DateTime(1970, 1, 1))).TotalMilliseconds;
                    var endUnixTime = (date.Add(new TimeSpan(20, 00, 00)).Subtract(new DateTime(1970, 1, 1))).TotalMilliseconds;
                    using (var reader = new StreamReader(new WebClient().OpenRead(string.Format("API For Fetch Data"))))
                    {
                        var x = reader.ReadLine();
                        RootObject data = JsonConvert.DeserializeObject<RootObject>(x);
                        if(minuteAggregateList.Any(node => node.ticker == data.ticker))
                        {
                             minuteAggregateList.Where(node => node.ticker == data.ticker)
                                                .Select(val => {
                                                      val.results.AddRange(data.results); 
                                                      return val;
                                                        }).ToList();
                        }
                        else
                        {
                             minuteAggregateList.Add(data);
                        }
                    }
                }
                if (daysCount == 7)
                    break;
            }
        }
  

Чтобы добавить данные в соответствующий список, сначала нужно выбрать соответствующий тикер (т.е. используя Where() ).
И затем после в Select() добавьте данные результата.
После этого изменения необходимо применить к существующему списку с помощью ToList() .

Комментарии:

1. откуда мы получим значение Val? для строки «значение.результаты. Добавить диапазон (данные.результаты);»

2. Извините за отсутствующий код. Обновите мой код. Значение Val берется из лямбда-выражения элемента select, значение которого удовлетворяло условию в Where().