我首先尝试过这个:
var users = await _service.Read();
var usersTemp = users as IList<UserDto> ?? users.ToList();
usersTemp.ToList().ForEach(u =>
{
if (usersTemp.Contains(u))
{
var good = Users.Remove(u);
}
Users.Add(u);
});
我只有一个用户来测试,但每次执行上面的代码时,该用户都会被添加到集合中。我添加了good
,发现Remove
无效。
现在,当我真的只想刷新它时重新创建集合:
Users = new ObservableCollection<UserDto>(await _service.Read());
OnPropertyChanged(nameof(Users));
我怎样才能更好地做到这一点?我希望能够在收到SignalR通知时将新用户添加到集合中,而不是执行另一个相对昂贵的Get并重新创建集合。
答案 0 :(得分:1)
删除适用于集合中的实际对象。 OP中的包含尝试比较最初不在列表中的对象。尝试使用某个标识符找到所需的对象,然后替换找到的对象。否则将其添加到列表中。
usersTemp.ToList().ForEach(u => {
var user = Users.FirstOrDefault(x => x.ID == u.ID);
if (user != null) {//User already exists
var index = Users.IndexOf(user);//get its location in list
Users[index] = u;//replace it with new object
} else {
Users.Add(u);
}
});