从IList中查找和删除

时间:2011-04-09 20:50:39

标签: c# linq-to-objects

我有一个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);
}

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

6 个答案:

答案 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}}变量

  1. 实际上包含在您的列表中
  2. 具有相同的RemovePlayer值,但不是同一个对象。
  3. 从您的代码示例中无法说出来。

    对于第一种情况,只需致电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;
}