簡體   English   中英

從 IList 中查找和刪除

[英]find and Remove from 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);
}

我想知道是否有更簡單的方法可以從此列表中刪除用戶

這個怎么樣? 如果您的參數User不是_Players一部分,請使用此_Players

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

SingleOrDefault()確保如果找不到匹配項,則返回 null。 嘗試刪除 null 時,不會發生或拋出錯誤。

如果您使用的User對象保存在 _ Players列表中(相同的對象引用),您可以這樣做

_Players.Remove(user);

否則,如果只有 id 匹配,您可以執行以下操作:

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

有兩種情況,您傳遞給RemovePlayeruser變量

  1. 實際上包含在您的列表中
  2. 具有相同的ID值,但不是同一個對象。

從您的代碼示例中無法說。

對於第一種情況,只需調用_Players.Remove(user) 對於第二種情況實現System.IEquatable<User>接口上User來定義默認EqualityComparer<User> ,然后再次調用_Players.Remove(user) 第二種情況適用於兩種情況。

視情況而定,如果您在用戶上實現了IEquatable以通過ID進行比較,那么您可以簡單地執行_Players.Remove(user)

除此以外:

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

僅在您有List<T>情況下:

所有提到的SingleOrDefault() / FirstOrDefault()算法都需要在列表中進行兩次遍歷:

1)第一個按條件找到項目的人

2)第二個通過在步驟#1中找到的值來查找項目的索引

這樣做會更有效率:

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

if (index >= 0)
  list.RemoveAt(index);

只是想做同樣的事情,但找不到標准的方法。
決定為我的 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;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM