/// <summary> /// Генерирует список карточек /// </summary> /// <param name="map">На карточке встречается только </param> /// <param name="uniqueEntry">Все квартиры на карточке из разных домов</param> /// <param name="isFlatsSorted">Сортируем квартиры на карточке</param> /// <returns></returns> private CardWorker GenerateCards(HomeMap map, bool uniqueEntry, bool isFlatsSorted) { // смапили дома и доступные квартиры var mappedDoors = new DoorsMap(); foreach (var full in map) { mappedDoors.Add(full, GetHomeDoors(full, map).ToList()); } // ограничиваем кол-во карточек CardWorker cards; if (uniqueEntry) { cards = new CardWorker(mappedDoors.BiggestDoorsContainer); } else { cards = new CardWorker(GetMaxCardsCount(mappedDoors.DoorsCount, _settings.MaxDoors)); } cards.SetCardCapacity(_settings.MaxDoors); // перемешиваю дома для лучшего распределения mappedDoors.ShuffleHomes(); var random = new Random(); while (!mappedDoors.IsEmpty) { var pair = mappedDoors.GetRandom(random); var full = pair.Key; var doors = pair.Value; while (doors.Any()) { var door = doors.GetRandom(random); cards.Add(door); doors.Remove(door); } mappedDoors.Remove(full); } if (isFlatsSorted) { // рассортировал квартиры в карточках cards.SortCardRecords(); } else { // перемешал записи в каждой карточке cards.ShuffleCardRecords(); } return(cards); }
///// <summary> ///// сгенерировать карточки согласно домам, правилам доступа и кодам. ///// </summary> //public void Generate() //{ // var allHomes = LoadingWork.LoadSortedHomes().Values.SelectMany(x => x).ToList(); // var allRules = LoadingWork.LoadRules().Values.ToList().SelectMany(x => x).ToList(); // var allCodes = LoadingWork.LoadCodes().Values.ToList().SelectMany(x => x).ToList(); // var allDoors = GetAllDoors(allHomes, allRules, allCodes); // var cards = GenerateCards(allHomes, allRules, allCodes, allDoors); // Write(cards); //} /// <summary> /// Генерирует карточки /// </summary> /// <param name="uniqueEntry"></param> /// <param name="isSorted"></param> public void Generate(bool uniqueEntry, bool isSorted) { var allHomes = LoadingWork.LoadSortedHomes().Values.SelectMany(x => x).ToList(); var allRules = LoadingWork.LoadRules().Values.ToList().SelectMany(x => x).ToList(); var allCodes = LoadingWork.LoadCodes().Values.ToList().SelectMany(x => x).ToList(); var map = new HomeMap(allHomes, allCodes, allRules); var cards = GenerateCards(map, uniqueEntry, isSorted); Write(cards); //var doors = GetAllDoors(map); }
private List <Door> GetAllDoors(HomeMap map) { var result = new List <Door>(); if (!map.Any()) { return(result); } foreach (var full in map) { result.AddRange(GetHomeDoors(full, map)); } return(result); }
/// <summary> /// Переносит старую инфу. Не создает дома!!! /// </summary> public void MigrateHomes() { var allHomes = _oldParser.LoadSortedHomes().Values.SelectMany(x => x).ToList(); var allRules = _oldParser.LoadRules().Values.ToList().SelectMany(x => x).ToList(); var allCodes = _oldParser.LoadCodes().Values.ToList().SelectMany(x => x).ToList(); // смапировали var map = new HomeMap(allHomes, allCodes, allRules); var homes = _newParser.LoadHomes(); var comparer = new HouseNumberComparerFromString(); foreach (var full in map) { var home = homes.FirstOrDefault(x => string.Equals(x.Street, full.Building.Street) && 0 == comparer.Compare(x.ToString(), full.Building.HouseNumber)); if (home == null) { continue; } homes.Remove(home); var doors = home .Doors .Select(x => ToDoor(x, full)); var copy = new Home(home, doors.ToList(), full.Building.HasConcierge, full.HomeInfo.Begin, full.Building.Floors, full.Building.Entrances); homes.Add(home); } _newParser.SaveHomes(homes); }
private IEnumerable <Door> GetHomeDoors(FullHomeInfo fullInfo, HomeMap source) { // объявляем переменные для краткости var home = fullInfo.Building; var homeInfo = fullInfo.HomeInfo; var rule = fullInfo.ForbiddenElement; var start = homeInfo.Begin; var all = new HashSet <int>(Enumerable.Range(start, home.Doors)); var forbidden = new HashSet <int>(); forbidden.UnionWith(rule.Aggressive); forbidden.UnionWith(rule.NoVisit); forbidden.UnionWith(rule.NoWorried); all.ExceptWith(forbidden); foreach (var i in all) { var temp = new Door(home) { Number = i, Entrance = GetEntrance(i - start, home.Doors, home.Entrances) }; var contains = homeInfo.AllCodes.ContainsKey(temp.Entrance); if (contains) { temp.Codes.AddRange(homeInfo.AllCodes[temp.Entrance]); } yield return(temp); } }
public void Repair(bool isSorted) { // // Загрузили из файлов всю инфу // var allHomes = LoadingWork.LoadSortedHomes().Values.SelectMany(x => x).ToList(); var allRules = LoadingWork.LoadRules().Values.ToList().SelectMany(x => x).ToList(); var allCodes = LoadingWork.LoadCodes().Values.ToList().SelectMany(x => x).ToList(); var allCards = LoadingWork.LoadCards(); // смапировали var map = new HomeMap(allHomes, allCodes, allRules); // сгенерили все двери var allDoors = GetAllDoors(map); // // Пока что не планируется поддержка заполнения новых квартир, // сопряжено с трудностями сортировки. // Пока что просто логгируем то, что есть ещё квартиры для заполнения // // список квартир, которых нет в домах, информация о которых // была скачана var notExisting = new List <Door>(); foreach (var pair in allCards) { Card card = pair.Value; for (int i = 0; i < card.Doors.Count; i++) { var find = allDoors.FirstOrDefault(x => x.IsTheSameObject(card.Doors[i])); if (find == null) { notExisting.Add(card.Doors[i]); continue; } // заменяем на новую card.Doors[i] = find; } if (isSorted) { card.Doors = card .Doors .OrderBy(x => x.Street) .ThenBy(x => x.HouseNumber, new HouseNumberComparerFromString()) .ToList(); } else { card.Doors = card.Doors.Shuffle().ToList(); } } if (notExisting.Any()) { var all = notExisting.Aggregate("", (main, door) => main += door.ToString() + "\n"); Tracer.Tracer.Instance.Write("Следующих квартир не существует в выбранных домах: \n\n" + all); } var cardDoors = allCards.SelectMany(x => x.Value.Doors).ToList(); var needToAdd = allDoors.Except(cardDoors, new BaseFindableObjectComparer()).ToList(); if (needToAdd.Any()) { //var all = needToAdd.Aggregate("", (main, door) => main += door.ToString() + "\n"); Tracer.Tracer.Instance.Write("Данных квартир нет в участках: \n\n" + string.Join("\n", needToAdd)); } foreach (var pair in allCards) { // записали карточку var toWrite = JsonConvert.SerializeObject(pair.Value, Formatting.Indented); File.WriteAllText(pair.Key, toWrite); } }
void AddPins(object sender, EventArgs e) //function adds all the pins to the map { Dictionary <string, Pin> pickerplaces = new Dictionary <string, Pin> //treating pins as a Dictionary of strings in order to access pin locations for picker { { "Winco", new Pin //declaring pins , relevant bc this is where I go to get food { Type = PinType.Place, Address = "555 Grand Ave, San Marcos, CA 92078, United States", Label = "Winco Foods", Position = new Position(33.135040, -117.176830) } //HomeMap.Pins.Add(Pin) }, { "24 Hour Fitness", new Pin //declaring pins, relevant bc I (used to) love going to the gym { Type = PinType.Place, Address = "641 S Rancho Santa Fe Rd, San Marcos, CA 92069, United States", Label = "24 Hour Fitness", Position = new Position(33.133180, -117.206660) } }, //HomeMap.Pins.Add(pin2); { "Mom's House", new Pin //declaring pins, relevant bc my dog is there and so are my parents { Type = PinType.Place, Address = "1943 C Ave, National City, CA 91950, United States", Label = "Mom's House", Position = new Position(32.666570, -117.099840) } }, //HomeMap.Pins.Add(pin3); { "Self Quarantine aka home", new Pin //declaring pin, relevant bc it's my house { Type = PinType.Place, Address = "353 W San Marcos Blvd, San Marcos, CA 92069, United States", Label = "Self Quarantine aka home", Position = new Position(33.138550, -117.168890) } }, { "Discovery Lake", new Pin //declaring pin, relevant to me bc I (used to) go hiking there a lot { Type = PinType.Place, Address = "3650 Foxhall Dr, San Marcos, CA 92078, United States", Label = "Discovery Lake", Position = new Position(33.126600, -117.177300) } }, }; foreach (Pin pin in pickerplaces.Values) //adding all pins to the map { HomeMap.Pins.Add(pin); } ; // HomeMap.Pins.Add(pin4) Picker.SelectedIndexChanged += (button, args) => //if the selected instance of the picker is changed { string location = Picker.Items[Picker.SelectedIndex]; //location is based off of the picker index selected var NewLocation = pickerplaces[location].Position; //the new location of the map will be based on the pin position of the picker index selected HomeMap.MoveToRegion(MapSpan.FromCenterAndRadius(NewLocation, Distance.FromMiles(.50))); //moves to region based on picker }; }