Не могу описать метод добавления в список
Есть код, в котором мне необходимо реализовать работу интерфейса,
public interface IUsersStorage
{
List<User> GetAll();
User TryGetById(int id);
void Add(User user);
}
и вот что должно получаться при выводе на консоль
IUsersStorage usersStorage = new UsersInMemoryStorage();
List<User> users = usersStorage.GetAll();
usersStorage.Add(new User { Id = 1, Name = "Ivan", Age = 25 });
usersStorage.Add(new User { Id = 2, Name = "NeIvan", Age = 2 });
Console.WriteLine(users.Count == 2); // True
Так как мне реализовать метод Add, чтобы все работало? Я, честно признаюсь, третий день пытаюсь решить это. С условием что в Main() ничего менять нельзя.
Класс UsersInMemoryStorage
public class UsersInMemoryStorage : IUsersStorage
{
private static List<User> _users = new List<User>();
public void Add(User user)
{
}
public List<User> GetAll()
{
List<User> vs = new List<User>();
foreach (User item in _users)
{
vs.Add(item);
}
return vs;
}
public User TryGetById(int id)
{
foreach (var item in _users)
{
if (item.Id == id)
{
return item;
}
}
return null;
}
}
Ответы (2 шт):
//Создаем хранилище.
IUsersStorage usersStorage = new UsersInMemoryStorage();
//Добавляем в хранилище юзеров
usersStorage.Add(new User { Id = 1, Name = "Ivan", Age = 25 });
usersStorage.Add(new User { Id = 2, Name = "NeIvan", Age = 2 });
//Затем берем всех юзеров.
List<User> users = usersStorage.GetAll();
Console.WriteLine(users.Count == 2); // True
Проблема в том что в Main ошибка List users = usersStorage.GetAll();
Юзеры берутся раньше чем добавляются, так что всегда будет False
public void Add(User user)
{
_users.Add(user);
}
Поскольку по условию должен измениться уже возвращённый список - вам нельзя делать копию списка, вы должны вернуть внутренний список или обёртку над ним.
Поскольку вы возвращаете именно List<User>, а не какой-нибудь интерфейс - вы не можете возвращать обёртку.
Таким образом, для решения задачи нужно написать вот так:
public List<User> GetAll()
{
return _users;
}
А теперь важное замечание: никогда так не делайте. Вам нужно поменять Main.
Или откажитесь от требования мутации уже возвращённого списка:
IUsersStorage usersStorage = new UsersInMemoryStorage();
List<User> usersBefore = usersStorage.GetAll();
usersStorage.Add(new User { Id = 1, Name = "Ivan", Age = 25 });
usersStorage.Add(new User { Id = 2, Name = "NeIvan", Age = 2 });
List<User> usersAfter = usersStorage.GetAll();
Console.WriteLine($"before {usersBefore.Count}, after {usersAfter.Count}"); // before 0, after 2
Или же используйте read-only интерфейсы:
public interface IUsersStorage
{
IReadOnlyCollection<User> GetAll();
User TryGetById(int id);
void Add(User user);
}