[英]Difficulty in Removing Items From List?
我有兩個清單。 第一個是所有學生,第二個是選定的學生。 我想如果我一次選擇一些學生,他們將從所有學生名單中刪除。 這是我的代碼,但不是。 學生不會被刪除。
foreach (var li in ListSelectedStudents.ToList())
{
if (ListAllStudents.Contains(li))
{
ListAllStudents.Remove(li);
}
}
Contains
將使用相等性來確定什么是“相等”,我在這里假設您的自定義類未提供自定義相等性實現,這意味着將為該類型提供默認的equatable,而只是使用引用相等性。 因此,即使您認為兩件事是“相等的”, Contains
方法也不是,因此也不會進入Remove
調用。
要獲得特定代碼的行為,你需要做的是提供一個實現IEquatable<Student>
在Student
類,如在備注說明這里 。
在這種情況下,實際上並不需要Contains
因為Remove
將執行相同的檢查。 如果沒有要刪除的內容,則Remove
調用將是透明的,實際上什么也沒做。
就像在我有機會提供信息之前在注釋中陷入的一樣, Remove
也將依賴於IEquatable<Student>
( docs ),因此您仍然需要提供一個實現,但這會使您的代碼看起來更IEquatable<Student>
:
foreach (var li in ListSelectedStudents.ToList())
{
ListAllStudents.Remove(li);
}
無需實現接口,可以有多種方法來執行此操作,但是您將無法使用當前代碼。 我將在周五留下其他答案來回答這些替代方案,而我的大腦仍無法正常運行。
您是否嘗試過使用linq:
ListAllStudents.RemoveAll(m => ListSelectedStudents.Contains(m));
如果不起作用,則對象中實現的默認比較可能有問題,您可以修復比較器,或者執行類似的操作:
ListAllStudents.RemoveAll(m => ListSelectedStudents.Any(n=>n.Id == m.Id)); // Assume the Id is the primary key of the object...
嘗試這個:
ListSelectedStudents = ListSelectedStudents.Where(a => !ListSelectedStudents.Contains(a)).Select(a => a).ToList();
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.