2017-01-30 6 views
0

문제점은 두 가지 유형이 포함 된 목록에서 특정 항목을 제거하려는 것입니다. 무엇을 시도해도 오류가 발생하고 유형을 사용할 수 있습니다. 클래스의 새 인스턴스를 만들면 이전을 삭제하지 않습니다. 나는 정말로 여기에 갇혀 있는데, 내가 무엇을해야하는지 잘 모른다.여러 유형이 포함 된 목록에서 특수 유형 제거 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

쉬운가요? 나는 내가 정말로 그것이 tho가하는 것을 이해한다라고 생각하지 않는다라는 것을 의미한다. "typ" "장난감"은 어떤 가치를 얻습니까? –

+0

오 기다려 나는 내가 이해할 것 같아요, 나는 목록에서 공 개체를 제거하고 나머지에만 포함 된 목록에 다시 만듭니다. –

+0

@ JohannesBjärehall 예, 볼이 아닌 오브젝트 만 새 목록을 만듭니다. –

1

당신은 당신의 솔루션으로 두 가지 문제가 있습니다

  1. 당신은 수정됩니다 당신은 foreach으로 반복하고있는 목록입니다. 그러면 InvalidOperationException이 표시됩니다.
  2. .GetType == Ball 이처럼 작동하지 않습니다. 대신 is을 사용하십시오.

이 시도 : 또한 LINQ를 사용할 수 있습니다

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

: 동일한 목록 것을 반복하는 동안 당신은 목록에서 항목을 제거 할 수 없습니다

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

남자, 나는 도전적으로 무언가를 배웠다, 내가 그것을 볼 때 정말로 쉬웠다 지금 지금 haha ​​(좋은 탱크)! –

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

도움을 주셔서 감사합니다, 당신의 코드를 볼 때 너무 분명해 보입니다. –