【问题标题】:find and Remove from IList从 IList 中查找和删除
【发布时间】:2011-04-09 20:50:38
【问题描述】:

我有一个用户列表

private IList<User> _Players

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

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

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

【问题讨论】:

    标签: c# linq-to-objects


    【解决方案1】:

    这个怎么样?如果您的参数 User 不是 _Players 的一部分,请使用此选项。

     _Players.Remove(_Players.SingleOrDefault(x => x.ID == User.ID));
    

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

    【讨论】:

      【解决方案2】:

      如果您使用的 User 对象包含在 _Players 列表中(相同的对象引用),您可以这样做

      _Players.Remove(user);
      

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

      _Players.RemoveAll( p => p.ID == user.ID);
      

      【讨论】:

      • RemoveAll 不适用于 IList,这是最初的问题。
      • 此答案不适用于原始问题。
      【解决方案3】:

      有两种情况,您传递给RemovePlayeruser 变量

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

      从您的代码示例中无法确定。

      对于第一种情况,只需致电_Players.Remove(user)。对于第二种情况,在User 上实现System.IEquatable&lt;User&gt; 接口以定义默认EqualityComparer&lt;User&gt;,然后再次调用_Players.Remove(user)。第二种情况适用于这两种情况。

      【讨论】:

      • 这个解决方案很有帮助,因为我使用的是泛型,我可以删除对象而无需知道它们包含的属性。
      • @David On SO 人们主要根据发帖人的得分而不是答案进行投票;这在这里得到了很好的证明:)
      【解决方案4】:

      取决于,如果您在您的用户上实现了IEquatable 以通过ID 进行比较,那么您可以简单地执行_Players.Remove(user)

      否则:

      var doomed = _Players.FirstOrDefault(p => p.ID == user.ID);
      if (doomed != null)
         _Players.Remove(doomed);
      

      【讨论】:

        【解决方案5】:

        只有在你有List&lt;T&gt;的情况下:

        所有提到的 SingleOrDefault() / FirstOrDefault() 算法都需要在列表中进行两次遍历:

        1) 第一个按条件查找项目

        2) 第二个通过在步骤#1中找到的值来查找项目的索引

        这样做会更有效率:

        int index = list.FindIndex(i => criteria);
        
        if (index >= 0)
          list.RemoveAt(index);
        

        【讨论】:

          【解决方案6】:

          只是想做同样的事情,但找不到标准方法。
          决定自己为我的 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;
          }
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2015-03-06
            • 1970-01-01
            • 2015-10-18
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多