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