Как добавить элементы для конкретного объекта данных во вложенном цикле в C #? - PullRequest
0 голосов
/ 01 апреля 2019

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

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

и Result Object похож на:

{
  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 && 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 находится в списке, добавьте новый элемент во вложенный Result of AAPL.Так как же сделать возможным добавлять элементы во вложенное положение под конкретным тикером?

Ответы [ 2 ]

1 голос
/ 04 апреля 2019

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

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 && 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;
            }
        }
1 голос
/ 03 апреля 2019

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

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 && 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().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...