static void Main(string[] args) { /** * Тестовый проект, для проверки почему ConcurentDictionary(int, User) оказался сортированным * * Ответ: потому что ConcurentDictionary - это hash-table * А для распределения объектов используется хэш-функция, которая для целого числа возвращает его же * Хэш-ключи сортированы, поэтому оказалось что и ConcurentDictionary сортирован * * Для проверки этого, вместо целочисленного ключа стала использовать строковый: ConcurentDictionary(string, User) * И в этом случае ConcurentDictionary действительно оказался несортированным **********/ User user7 = new User("g2", "family2", "name2"); User user8 = new User("h2", "family2", "name2"); User user9 = new User("i2", "family2", "name2"); User user10 = new User("j2", "family2", "name2"); User user3 = new User("c3", "family3", "name3"); User user1 = new User("a1", "family1", "name1"); User user2 = new User("b2", "family2", "name2"); User user4 = new User("d2", "family2", "name2"); User user5 = new User("e2", "family2", "name2"); User user6 = new User("f2", "family2", "name2"); UserRepository ur = new UserRepository(); ur.AddUser(user3); ur.AddUser(user1); Console.WriteLine("Two users were added (UserID=1 and UserID=3)"); ur.PrintRepository(); ur.AddUser(user2); Console.WriteLine("One user was added (UserID=2)"); ur.PrintRepository(); ur.AddUser(user8); ur.AddUser(user10); ur.AddUser(user4); ur.AddUser(user5); ur.PrintRepository(); ur.AddUser(user9); ur.AddUser(user6); ur.AddUser(user7); Console.WriteLine("CurrentRepository contains.."); ur.PrintRepository(); Console.ReadLine(); }
public void AddUser(User user) { // Write operation (AddUser) will be called much less often, but also can be called from several threads at the same time. lock (synchronizer) { concurentUsers.TryAdd(user.UserID, user); sortedUsers.Add(user.UserID, user); } }