На месте (без дополнительного хранилища). Нет строкового копирования (кроме списка результатов). Один сорт + один проход:
#include <string>
#include <vector>
#include <list>
#include <iostream>
#include <algorithm>
using namespace std;
int main() {
vector<string> vec{"words", "words", "are", "fun", "fun"};
list<string> dup;
sort(vec.begin(), vec.end());
const string empty{""};
const string* prev_p = ∅
for(const string& s: vec) {
if (*prev_p==s) dup.push_back(s);
prev_p = &s;
}
for(auto& w: dup) cout << w << ' ';
cout << '\n';
}
Прочитайте и сохраните информацию:
В этой части я не буду пропагандировать какую-либо библиотеку третьей части, которая будет просто читать и писать CSV. Как CSV Helper. Потому что очевидно, что вы должны его использовать.
var fileName = "input.txt";
var lines = File.ReadAllLines(fileName);//.Skip(1) // if you have an header.
var rawData = lines.Select(line => line.Split(';'))
.Select(item =>
{
Decimal lon, lat;
return new
{
date = DateTime.Parse(item[0]),
Lon = Decimal.TryParse(item[1], out lon) ? lon : 0,
Lat = Decimal.TryParse(item[2], out lat) ? lat : 0,
};
});
Decimal.TryParse(item[1], out lon) ? lon : 0
- это короткий путь к TryParse
входу и присвоению ему значения по умолчанию в случае сбоя.
На данный момент у вас есть список пользовательских объектов, который является точными данными, которые вы имели в файле. Чтение закончено, вы можете начать работать над ним. Чтобы знать, сколько задержки должна иметь каждая точка, нам нужно вычесть ее с первой датой-временем.
var referenceDate = rawData.Select(x => x.date).First();
var usefullData = rawData.Select(x =>
new
{
Delay = (x.date - referenceDate),
x.Lon,
x.Lat,
});
Теперь у нас есть полезные данные, задержка - это интервал времени, вы можете выразить его значение в нужной вам единице измерения. doc
Поскольку у нас нет информации о том, как вы будете отображать точку на карте, я буду предполагать, что: Когда пользователь отображает карту, вы должны рассчитать время, когда должна появиться каждая точка.
var readingTime = DateTime.Today.AddHours(19);
var displayData = usefullData.Select(x =>
new
{
Date = readingTime + x.Delay,
x.Lon,
x.Lat,
});
Да, вы можете сделать это.
По сути, у вас есть данные в CSV, вы можете написать API для чтения данных из csv и возврата объекта json. Вы можете сделать это, написав asp.net api.
Вот как читать CSV-файл на asp.net http://oniwebblog.blogspot.com/2016/01/aspnet-mvc-web-application-how-to-read_31.html [ 115]
Вот ссылка на сборку .net web api Написать веб-API
На стороне клиента вы можете использовать jquery для вызова API и получения данных json.
Теперь для построения местоположения можно использовать API Google для загрузки карты и рисования точек.
Вот как вы можете нарисовать значок на карте Google
В javascript вы можете использовать функцию setTimeout для вызова определенной функции через определенный интервал.
Есть несколько шагов, которые нужно предпринять, однако я остановлюсь только на первом. Преобразование результатов файла в некоторую структуру, которую вы можете использовать.
Остальное зависит от вас (и только для болезненных академических целей), вам нужно выбрать собственное приключение
Учитывая
public readonly struct Location
{
public DateTime TimeStamp { get; }
public Decimal Lat { get; }
public Decimal Lon { get; }
public Location(DateTime timeStamp, decimal lat, decimal lon)
{
TimeStamp = timeStamp;
Lat = lat;
Lon = lon;
}
}
Метод для преобразования
public static Location ConvertToLocation(string input)
{
var split = input.Split(';');
return new Location(DateTime.Parse(split[0]),decimal.Parse(split[1]),decimal.Parse(split[2]));
}
Использование
// List of locations
var results = File.ReadLines("SomeFileName").Select(ConvertToLocation);
Вы можете прочитать файл .csv с помощью потокового считывателя и разделить столбцы с помощью функции split (";"), определяя точку с запятой как разделитель каждой строки. После этого вы можете сохранять данные в arrayList или в таблицу базы данных в соответствии со столбцом.
List<string> lattitude=new List<string>();
List<string> longitude=new List<string>();
List<string> timestamp=new List<string();
using (var rd = new StreamReader("yourfile.csv"))
{
while (!rd.EndOfStream)
{
var arrlst= rd.ReadLine().Split(';');
timestamp.add(arrlst[0])
lattitude.Add(arrlst[1]);
longitude.Add(arrlst[2]);
}
}
Теперь вы можете использовать Timepicker для подсчета секунд, используя счетчик для отслеживания каждые 13 секунд. [Вы можете получить интервал секунд, получая разницу смежных времен от отметки времени] всякий раз, когда счетчик считает до 13, то снова запустите счетчик с 0. Вы будете выполнять вышеуказанные шаги, пока все данные в нужном списке не будут прочитаны. когда все данные прочитаны, вы можете остановить таймер, вызывая логику. Это способ получения данных из необходимого списка по одному в соответствии со значением метки времени и в соответствии с вашими потребностями.
Тема: создайте несколько тем с помощью новой темы (). запускайте потоки, основываясь на ваших интервалах.
Надеюсь, это поможет. Благодаря