2017-01-30 57 views
0

我遇到的問題是我想從包含2種不同類型的列表中刪除某個項目。無論我嘗試什麼,我只是得到錯誤,並且我可以使用類型,如果我創建該類的新實例,它不會刪除舊的。我真的被困在這裏,我不知道我該怎麼做。從包含多種類型的列表中刪除特殊類型C#

private List<Toys> toys = new List<Toys>(); 
toys.Add(new Ball("red")); 
toys.Add(new MouseToy("gray")); 

public abstract class Toys {}  
public class Ball : Toys {} 
public class MouseToy : Toys {} 

//how do i remove only one of the types? 
//beacuse this does not work witch is one of many things i tried 
    foreach(var toy in toys){ 
     if (toy.GetType == Ball){ 
      toys.Remove(toy) 
     } 
    } 

這幾乎是我用於列表的代碼。

回答

3

你可以做到這:

toys = toys.Where(toy=>!(toy is Ball)).ToList(); 

如前所述@Sefe在評論(感謝):你可以使用做到這一點即使是簡單的,並與

List<MouseToy> mouseToys = toys.OfType<MouseToy>().ToList(); 

更好,如果它的確定爲您,您的新收藏品將是List<MouseToy>而不是List<Toys>。如果你會得到一個三等CatToy這是行不通的,你仍然想要得到的所有項目,但不是Ball

+0

這是否容易?我的意思是我不認爲我真的明白它在做什麼。玩具獲得什麼價值「典型」「物」? –

+0

哦,等等,我想我明白了,我從列表中刪除球對象,然後再次將它列入其中只包含其餘的列表。 –

+0

@JohannesBjärehall是的,你創建一個新的列表,其中只有那些不是Ball的對象。 –

1

你有兩個問題與您的解決方案:

  1. 您正在修改您正在迭代的列表爲foreach。這將導致InvalidOperationException
  2. .GetType == Ball不能像這樣工作。改爲使用is

試試這個:

foreach(var toy in toys.ToArray()){ 
    if (toy is Ball){ 
     toys.Remove(toy); 
    } 
} 

你也可以使用LINQ:

foreach(var toy in toys.OfType<Ball>().ToArray()){ 
    toys.Remove(toy); 
} 
+0

男人,我反悔地學到了一些東西,當我現在看它時,真的很容易哈哈,坦克無論如何! –

1

在遍歷同一個列表不能從列表中刪除項目。您可以使用反向for環(即環降序):

for (int i = toys.Length - 1; i >= 0; i--) 
{ 
    if (toys[i] is Ball) 
    { 
     toys.RemoveAt(i); 
    } 
} 

...或者你可以使用在System.Linq命名空間中定義的方法之一。 Maksim Simkin展示瞭如何使用Where方法;您也可以使用OfTypeExcept方法:

toys = toys.Except(toys.OfType<Ball>()) 
      .ToList(); 
+0

感謝您的幫助,當我看到您的代碼時,它似乎非常明顯。 –