/
renix
/
TravelGuide
Обзор
Документация
Войти
/
renix
/
TravelGuide
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
Аналитика
Безопасность
master
back/Services/MatrixService.cs
98 строк
3 KB
atikinvobud
Матрица дистанций и Эндпоинты Олега
03 апр 2025, 17:10
03 апр 2025, 17:10
a058564
Код
Авторство
О чём код?
using MongoDB.Bson; using MongoDB.Driver; using System; using System.Collections.Generic; using System.Threading.Tasks; namespace back.Services; public class MatrixService { private readonly IMongoCollection<BsonDocument> _collection; public MatrixService(MongoDbContext context) { _collection = context.Database.GetCollection<BsonDocument>("distance_matrix"); } /// <summary> /// Сохраняет или обновляет матрицу расстояний. /// </summary> public async Task<int> SaveOrUpdateDistanceMatrixAsync(List<double[]> distanceMatrix) { var bsonMatrix = new BsonArray(); foreach (var row in distanceMatrix) { bsonMatrix.Add(new BsonArray(row)); } // Ищем существующий документ var existingDocument = await _collection.Find(new BsonDocument()).FirstOrDefaultAsync(); if (existingDocument != null) { // Обновляем существующую матрицу var update = Builders<BsonDocument>.Update.Set("distance_matrix", bsonMatrix); await _collection.UpdateOneAsync(new BsonDocument(), update); return existingDocument["id"].AsInt32; // Возвращаем существующий ID } else { // Создаем новый документ int newId = 1; var newDocument = new BsonDocument { { "id", newId }, { "distance_matrix", bsonMatrix } }; await _collection.InsertOneAsync(newDocument); return newId; // Возвращаем новый ID } } /// <summary> /// Получает матрицу расстояний из базы. /// </summary> public List<double[]>? GetDistanceMatrixAsync() { var document = _collection.Find(new BsonDocument()).FirstOrDefault(); if (document == null) return null; var bsonMatrix = document["distance_matrix"].AsBsonArray; var matrix = new List<double[]>(); foreach (var row in bsonMatrix) { matrix.Add(row.AsBsonArray.Select(x => x.AsDouble).ToArray()); } return matrix; } /// <summary> /// Обновляет матрицу расстояний. /// </summary> public async Task<bool> UpdateDistanceMatrixAsync(List<double[]> newMatrix) { var bsonMatrix = new BsonArray(); foreach (var row in newMatrix) { bsonMatrix.Add(new BsonArray(row)); } var update = Builders<BsonDocument>.Update.Set("distance_matrix", bsonMatrix); var result = await _collection.UpdateOneAsync(new BsonDocument(), update); return result.ModifiedCount > 0; } /// <summary> /// Удаляет матрицу расстояний по ID. /// </summary> public async Task<bool> DeleteMatrixAsync(int id) { var filter = Builders<BsonDocument>.Filter.Eq("id", id); var result = await _collection.DeleteOneAsync(filter); return result.DeletedCount > 0; } }