2013-01-03 1 views
25

나는 popuped 된 IEnumerable<User> 컬렉션을 가지고 있습니다.IEnumerable <T> 컬렉션에서 항목을 제거하고 싶습니다.

항목을 제거하고 싶습니다. 어떻게해야합니까?

foreach(var u in users) 
{ 
    if(u.userId = 1123) 
    { 
    // remove! 
    } 
} 

나는 루핑하는 동안 제거하지 않는 것을 알고 있으므로 새 컬렉션을 만들거나 제거하는 것을 신경 쓰지 않습니다.

하지만 항목을 제거하는 방법을 모르겠다. 어떤 이유로이 부분을 잃어 버렸습니다.

IEnumerable<User> modifiedUsers = new List<User>(); 

foreach(var u in users) 
{ 
    if(u.userId != 1233) 
    { 
     modifiedUsers.add ?????? 
    } 
} 

가 어떻게 컬렉션에 추가 할 수 있습니다 : 나는 또한에 혼란 스러워요

다른 방법으로, 어떻게 내가 좋아하는 새 컬렉션을 만들 수 있습니까?

답변

0

수 없습니다. IEnumerable<T>은 반복 될 수 있습니다. 두 번째 예에서

, 당신은 당신이를 IEnumerable에서 항목을 제거 할 수 없습니다 그것을

foreach(var u in users.ToArray()) // ToArray creates a copy 
{ 
    if(u.userId != 1233) 
    { 
     users.Remove(u); 
    } 
} 
8

의 사본 반복에 의해 원래의 컬렉션에서 제거 할 수 있습니다, 그것은 단지 열거 할 수있다. 여기에 설명 된 바와 같이 : 기본 개체가 ICollection에를 구현하는 경우 당신은 추가 항목을 제거 할 경우 ICollection이를 사용할 필요가 http://msdn.microsoft.com/en-us/library/system.collections.ienumerable.aspx

, 어쩌면 당신이 시도하고는 IEnumerable을 주조 할 수 있습니다,이 과정 떨어져에만 작동합니다.

ICollection에 대한 자세한 내용은 여기를 참조하십시오.
http://msdn.microsoft.com/en-us/library/92t2ye13.aspx

오프 물론 단지 lante에 의해 지적, 귀하는 IEnumerable에서 새 목록을 만들 수 있지만,이 과정 떨어져 실제 사용 사례에 따라 "서브 최적의"수 있습니다.
아마도 ICollection을 사용하는 것이 좋습니다.

4

IEnumerableList으로 바꾸어보십시오. 이 시점부터 List 님의 Remove 메서드를 사용하여 항목을 제거 할 수 있습니다.

는 다음과 같은 방법으로 항목을 얻을 수 있습니다 Linq에를 사용하여 Remove 방법에 PARAM로 전달하려면 :

  • users.Single(x => x.userId == 1123)
  • users.First(x => x.userId == 1123)

코드는 다음과 같다 :

users = users.ToList(); // Get IEnumerable as List 

users.Remove(users.First(x => x.userId == 1123)); // Remove item 

// Finished 
+0

사용할 수 있지만 그것은 IEnumerable을 afterwords를 기대하고 뭔가에 할당 할 수있는? 처음부터 다시 시작해야합니까? – loyalflow

+0

@ user1361315 물론 List는 IEnumerable을 구현하므로 실제로 IEnumerable에 넣을 수 있습니다 – dutzu

28

부 LINQ와 그 요소가없는 새로운 배열을 생성 t :

// remove 
users = users.Where(u => u.userId != 123).ToList(); 

// new list 
var modified = users.Where(u => u.userId == 123).ToList(); 
+0

두 경우 모두에서 새 목록을 만듭니다. 첫 번째 예제는 참조를 덮어 씁니다. –

+0

예, 그렇습니까? 너에게 효과가 없어? – lante

+3

귀하의 용어가 올바르지 않습니다. 목록에서 항목을 제거하지 않습니다. 두 예제 모두에서 새 목록을 만들고 이전 목록은 영향을받지 않습니다. 첫 번째 예제에서 참조를 덮어 쓰는 것뿐입니다. 즉, 'remove'가 잘못되었다는 의미입니다. 문제를 명확히하기 위해 질문을 업데이트해야합니다. –

0

IEnumerable 인터페이스 그건 그냥은 열거 - 그것은 Add 또는 Remove 어떤 방법을 제공하거나 모든 목록을 수정하지 않습니다.

인터페이스는 단지 몇 가지 항목을 반복하는 방법을 제공합니다

- 왜 당신은 그냥 IEnumerable

// Treat this like a list, not an enumerable 
List<User> modifiedUsers = new List<User>(); 

foreach(var u in users) 
{ 
    if(u.userId != 1233) 
    { 
     // Use List<T>.Add 
     modifiedUsers.Add(u); 
    } 
} 
에 암시 적 캐스트없이 코드를 사용하지 않는 IEnumerable

List<T>로 구현됩니다 열거를 필요로 대부분의 구현을

+0

나는 그것을 수정해야하고, 그 다음 그것을 기대하는 무언가에 전달해야한다. – loyalflow

+0

그런 다음 수정하고 전달하십시오.'List '이'IEnumerable '에서 파생되기 때문에'List '을'IEnumerable '을 기대하는 메소드에 전달할 수 없습니다. 공분산 규칙 때문에 캐스트가 필요하다고 생각조차하지 않습니다. – Charleh

관련 문제