我有一个IList用户
private IList<User> _Players
我有一种从列表中删除特定用户的方法
public virtual void RemovePlayer(User User)
{
int index=_Players.Select(T=>T.ID).ToList().IndexOf(User.ID);
_Players.RemoveAt(index);
}
我想知道是否有更简单的方法从此列表中删除用户
答案 0 :(得分:11)
如果您使用的User
对象保存在_ Players
列表中(相同的对象引用),您可以这样做
_Players.Remove(user);
否则,如果只有id匹配,你可以这样做:
_Players.RemoveAll( p => p.ID == user.ID);
答案 1 :(得分:9)
这个怎么样?如果您的参数User
不属于_Players
,请使用此选项。
_Players.Remove(_Players.SingleOrDefault(x => x.ID == User.ID));
SingleOrDefault()
确保如果未找到匹配项,则返回null。尝试删除null时,不会发生错误或抛出错误。
答案 2 :(得分:7)
有两种情况,即您传递给user
的{{1}}变量
RemovePlayer
值,但不是同一个对象。从您的代码示例中无法说出来。
对于第一种情况,只需致电ID
。对于第二种情况,在_Players.Remove(user)
上实施System.IEquatable<User>
界面以定义默认User
,然后再次调用EqualityComparer<User>
。第二种情况适用于这两种情况。
答案 3 :(得分:3)
取决于,如果您已对用户实施IEquatable
以便ID
进行比较,那么您只需执行_Players.Remove(user)
。
否则:
var doomed = _Players.FirstOrDefault(p => p.ID == user.ID);
if (doomed != null)
_Players.Remove(doomed);
答案 4 :(得分:1)
仅在您拥有List<T>
所有提到的SingleOrDefault()
/ FirstOrDefault()
算法需要在列表中进行两次遍历:
1)第一个按标准查找项目
2)第二个通过步骤#1中找到的值找到项目的索引
这样做会更有效率:
int index = list.FindIndex(i => criteria);
if (index >= 0)
list.RemoveAt(index);
答案 5 :(得分:0)
只是想做同样的事情,但找不到标准的方法。
决定为我的 int 列表自己编写代码。
这个小家伙不会做双关单的!
您可以将 int
替换为 object
以使用类。
public static bool FindAndRemoveFirst(this ICollection<int> list, Func<int, bool> predicate)
{
var en = list.GetEnumerator();
while (en.MoveNext())
{
if (predicate(en.Current))
{
list.Remove(en.Current);
return true;
}
}
return false;
}