簡體   English   中英

從列表中刪除項目有困難嗎?

[英]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.

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