2017-01-30 16 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) 
     } 
    } 

これは、リストに使用するコードとほぼ同じです。

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

としては、(感謝)コメントで@Sefeを述べた:あなたは使用することができ、あなたのことを、それはあなたのために大丈夫だ場合

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

とそれも簡単で、もっと良いあなただけんでした

答えて

3

新しいコレクションはList<MouseToy>でなく、List<Toys>になります。あなたは第三のクラスCatToyを取得する場合、それは動作しませんし、あなたはまだ、すべてのアイテムを取得したいだろうではなく、クラスBall

+0

それは簡単ですか?私は私が本当にそれがtho何を理解しているとは思わないことを意味します。どのような価値 "typ" "物"はおもちゃを得るのですか? –

+0

ああ、私は理解していると思う、私はリストからボールのオブジェクトを削除し、残りの部分だけを再度リストにします。 –

+0

@JohannesBjärehallはい、ボールではないオブジェクトだけが新しいリストを作成します。 –

1

あなたはあなたのソリューションには2つの問題があります。

  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

助けてくれてありがとう、私はあなたのコードを参照してくださいときにとても明らかです。 –

関連する問題