Добавление рандомного элемента из массива строк в Dictionary на C#

158
29 мая 2022, 13:00

В общем, надо добавить факультеты в словарь Dictionary <string,Person> faculty, ключ-строка, значение-человек(студент или преподаватель).
Для выбора названий факультета есть массив строк faculties, откуда в цикле for добавляется рандомно выбранный элемент из faculties в качестве ключа.
Беда в том, что добавив несколько элементов происходит зацикливание. Ну допустим, он выбирает элемент "ФЭМБИ", добавляет его, потом добавляет следующий, но в итоге у программы не остается выбора кроме как добавить уже добавленный ключ, он опять выбирает "ФЭМБИ", происходит эксепшн, там происходит откат на шаг назад, он снова пытается добавить "ФЭМБИ", снова уходит в эксепшн......
Понятно, что чем больше названий факультетов для выбора, тем меньше вероятности, что произойдет зацикливание, но хотелось бы как то заставить программу пахать с небольшим количеством вариантов для выбора) Можно как-то "обмануть" словарь чтобы он добавлял уже добавленные ключи?

    using laba10;
    using System;
    using System.Collections.Generic;
    using System.Linq;

namespace laba14
{
 class Program
  {
    static void Main(string[] args)
    {            
        Dictionary<string, Person> faculty = new Dictionary<string, Person>();
        List<Dictionary<string, Person>> university = new List<Dictionary<string, Person>>();
        Random rand = new Random();
        string[] faculties = {"ФЭМБИ", "ФГиГИТ", "МИЭФ", "МИРЭК", "ФДП"};
        Console.ForegroundColor = ConsoleColor.DarkYellow;
        Console.WriteLine("\nДобавление элементов в коллекцию:");
        Console.ResetColor();
        Console.ForegroundColor = ConsoleColor.DarkYellow;
        Console.WriteLine("\nВведите количество элементов для добавления:\n");
        Console.ResetColor();
        int size;
        bool ok = int.TryParse(Console.ReadLine(), out size);
        for (int i = 0; i < size; i++)
        {
            try
            {
                //чтобы половина была студентов, половина преподавателей
                if (i % 2 == 0)
                {
                    faculty.Add(faculties[rand.Next(faculties.Length)], new Student());
                    
                }
                else
                {
                    faculty.Add(faculties[rand.Next(faculties.Length)], new Teacher());
                }
            }
            catch (Exception)
            {
                i--;
            }
        }
        foreach (var v in faculty.Keys)
        {
            Console.WriteLine($"{v}  |   {faculty[v]}");
        }
    }
}
}

Вот в этой строчке добавление чтобы не искать в коде:

faculty.Add(faculties[rand.Next(faculties.Length)], new Student());
Answer 1

В общем я просто поменяла ключ-значение местами, теперь на месте ключа объект Person (имя+фамилия+возраст), поэтому уникальность повышается в разы, 100,000 элементов из 36 фамилий+36 имен+ возраста в диапазоне от 18 до 80 формирует. Изменились строчки:

          Dictionary< Person,string> faculty = new Dictionary< Person,string>();
         List<Dictionary< Person,string>> university = new List<Dictionary< Person,string>>();
               //чтобы половина была студентов, половина преподавателей
                if (i % 2 == 0)
                {
                    faculty.Add(new Student(),faculties[rand.Next(faculties.Length)]);
                    
                }
                else
                {
                    faculty.Add(new Teacher(), faculties[rand.Next(faculties.Length)]);
                }
Answer 2

Все, отмена, я сделала ситуацию еще страшнее. Добавила класс отдельно для факультета, теперь все пашет как надо (до поры до времени)

    public class Faculty
{ 
    string Name { get; set; }
    Random rand = new Random();
    string[] faculties = { "ФЭМБИ", "ФГиГИТ", "МИЭФ", "МИРЭК", "ФДП", "ИСФ", "СГФ", "ТЭФ", "ФАИД", "ФАД", "ФКФН", "ЮФ", "ЗФ", "МИЭМ", "ФПЭ", "ИКТ", "ПМИ" };
   
    public Faculty()
    {
        Name = faculties[rand.Next(faculties.Length)];
    }
    public Faculty(string name)
    {
        Name = name;
    }
    public override string ToString()
    {
        return $"{Name}";
    }
}
class Program
{
    static void Main(string[] args)
    {            
        Dictionary<Faculty,Person> faculty = new Dictionary<Faculty, Person>();
        List<Dictionary<Faculty, Person>> university = 
            new List<Dictionary<Faculty, Person>>();
        Random rand = new Random();
        
        Console.ForegroundColor = ConsoleColor.DarkYellow;
        Console.WriteLine("\nДобавление элементов в коллекцию:");
        Console.ResetColor();
        Console.ForegroundColor = ConsoleColor.DarkYellow;
        Console.WriteLine("\nВведите количество элементов для добавления:\n");
        Console.ResetColor();
        int size;
        bool ok = int.TryParse(Console.ReadLine(), out size);
        for (int i = 0; i < size; i++)
        {
            try
            {
                //чтобы половина была студентов, половина преподавателей
                if (i % 2 == 0)
                {
                    faculty.Add(new Faculty(), new Student());
                }
                else
                {
                    faculty.Add(new Faculty(), new Teacher());
                }
            }
            catch (Exception)
            {
                i--;
            }
        }
        foreach (var v in faculty.Keys)
        {
            Console.WriteLine($"{v}  |   {faculty[v]}");
        }
}
READ ALSO
super().__init__() является аналогом base: в c#?

super().__init__() является аналогом base: в c#?

super()__init__() является аналогом base: в c#?

260
Подключение к серверу по UDP

Подключение к серверу по UDP

Написан сервер на c#

157
Поясните, как работать с LockBits классом

Поясните, как работать с LockBits классом

В своём проекте я использую изображения большого разрешения, из-за чего методы getpixel/setpixel работают очень медленно, то-есть програма лагает,...

209