2011-04-09 63 views
6

刪除我的用戶的IList的發現和自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); 
} 

我想知道是否有一個更簡單從這個列表中刪除用戶的方法

回答

4

有兩種情況,在user變量要傳遞到RemovePlayer

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

從您的代碼示例中不可能說出來。

對於第一種情況只需撥打_Players.Remove(user)。對於第二種情況,執行上的System.IEquatable<User>接口來定義默認EqualityComparer<User>,然後再次調用_Players.Remove(user)。第二種情況在兩種情況下均適用。

+0

這個解決方案可以幫助很多,因爲我使用的是泛型,我可以刪除對象而無需知道它們包含的屬性。 – David 2011-04-10 06:39:57

+0

作品完美;) – Soren 2013-01-02 04:47:29

+0

我不能相信你不是最投票的解決方案!你的解決方案是BP – David 2014-03-13 11:18:48

8

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

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

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

11

如果你可以做你使用_ Players列表(同一對象的引用)內舉行的User對象

_Players.Remove(user); 

否則,如果只有ID相匹配,你可以這樣做:

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

RemoveAll不適用於IList,這是原來的問題。 – 2012-12-14 21:29:09

+0

此答案不適用於原始問題。 – Javiere 2018-02-01 11:13:31

3

取決於,如果您已對您的用戶執行IEquatable以便與ID比較,那麼您可以簡單地執行_Players.Remove(user)

否則:

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

只有在情況下,如果你有List<T>

所有SingleOrDefault()/FirstOrDefault()要求列表中的兩個遍歷所提到的算法:

1)第一個找到的標準項目

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

這樣做更有效率取而代之:

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

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