从IList中查找和删除

Dav*_*vid 7 c# linq-to-objects

我有一个IList用户

private IList<User> _Players
Run Code Online (Sandbox Code Playgroud)

我有一种方法从列表中删除特定用户

public virtual void RemovePlayer(User User)
{
    int index=_Players.Select(T=>T.ID).ToList().IndexOf(User.ID);
    _Players.RemoveAt(index);
}
Run Code Online (Sandbox Code Playgroud)

我想知道是否有一种更简单的方法可以从此列表中删除用户

Bro*_*ass 11

如果User您使用的对象保存在_ Playerslist(相同的对象引用)中,您可以这样做

_Players.Remove(user);
Run Code Online (Sandbox Code Playgroud)

否则,如果只有id匹配,你可以这样做:

_Players.RemoveAll( p => p.ID == user.ID);
Run Code Online (Sandbox Code Playgroud)

  • RemoveAll不适用于IList,这是最初的问题. (11认同)
  • 这个答案不适用于原来的问题。 (2认同)

p.c*_*ell 9

这个怎么样?如果您的参数User不属于,请使用此选项_Players.

 _Players.Remove(_Players.SingleOrDefault(x => x.ID == User.ID));
Run Code Online (Sandbox Code Playgroud)

SingleOrDefault()确保如果没有找到匹配,则返回NULL.尝试删除null时,不会发生错误或抛出错误.


bri*_*ler 7

有两种情况,user即您要传递的变量RemovePlayer

  1. 实际上包含在您的列表中
  2. 具有相同的ID值,但不是同一个对象.

从您的代码示例中无法说出来.

对于第一种情况,只需打电话_Players.Remove(user).对于第二种情况,实现 System.IEquatable<User>接口on User以定义默认值EqualityComparer<User>然后再次调用_Players.Remove(user).第二种情况适用于这两种情况.


Chr*_*Wue 5

视情况而定,如果您已经IEquatable对用户实施了比较ID,那么您可以简单地执行_Players.Remove(user).

除此以外:

var doomed = _Players.FirstOrDefault(p => p.ID == user.ID);
if (doomed != null)
   _Players.Remove(doomed);
Run Code Online (Sandbox Code Playgroud)