[英]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);
有兩種情況,您傳遞給RemovePlayer
的user
變量
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.