2013-03-23 8 views
8

특정 요구 사항을 충족하는 경우 중첩 목록을 다른 목록에서 쉽게 제거 할 수 있습니까? 예를 들어, 우리가 정류장을 가지고 있다고 가정하고, 각 정류장 콜을 라우트라고 부르기로 결정했습니다. 각 경로는에서 목록에 있습니다. 그런 다음 각 경로를 목록에 넣기로 결정합니다.C# 목록에서 목록 제거

이제 라우트 목록이 생겼으므로 특정 유형의 라우트가 실제로 라우트 목록에 포함되지 않아야한다고 결정했습니다. 해당 경로를 제거하려면 어떻게해야합니까?

예 클래스

public class Stops 
{ 
    public Stops(int _param1, string _param2) 
    { 
     param1 = _param1; 
     param2 = _param2; 
    } 

    public int param1 { get; set; } 
    public string param2 { get; set; } 
} 

어떻게 말하자면,이 lstRoutes에서 어떤 경로 6을 초과하는 PARAM1 값을 제거 할 수있는 목록

List<List<Stops>> lstRoutes = new List<List<Stops>>(); 
List<Stops> lstStops = new List<Stops>(); 
List<Stops> lstMoreStops = new List<Stops>(); 

// Create some stops 
for (int i = 0; i < 5; i++) 
{ 
    lstStops.Add(new Stops(i, "some text")); 
} 

lstRoutes.Add(lstStops); 

// Create some more stops 
for (int i = 5; i < 10; i++) 
{ 
    lstMoreStops.Add(new Stops(i, "some more text")); 
} 

lstRoutes.Add(lstMoreStops); 

만들기 : 여기에 몇 가지 예제 코드는?

답변

7

간단한 방법 (모든 enumerables에 적용 할 수 없습니다 단지 나열) :

lstRoutes = lstRoutes.Where(r => !r.Any(s => s.param1 > 6)).ToList(); 

는이 때문에 복사가 발생합니다 새 목록을 생성합니다. 가장 효율적인 방법은 처음에 그 항목을 목록에 추가하지 않는 것입니다. 두 번째 가장 효율적인 새로운 하나를 구성하는 대신 목록 자체에서 항목을 제거하는 것입니다 :

lstRoutes.RemoveAll(r => r.Any(s => s.param1 > 6)); 
+0

하 나는 내가 처음 속도의 목록에 추가 피할 수 바랍니다. 불행하게도, 시작리스트는 일련의 순열이고 나는 이해가되지 않는 순열을 없애는 임무를 갖는다. 게시 한 첫 번째 코드 비트가 다음과 같은 오류를 던졌습니다. 람다식이 대리자 형식이 아니므로 입력 할 수 없습니다. 하지만 두 번째 비트는 훌륭하게 작동했습니다. 고마워요! –

+0

내가 param1의 인덱스를 얻는 방법을 알고 있습니까? 나는이 경우 항상 0이 될 것이지만, 각 경로는 많은 정수로 구성되어 있으며, 6 이전에 발생한 모든 경로를 제거하고 싶다고 말합니다. 그렇지 않으면 큰 문제가되지 않습니다. 나는 그것을 알아 내거나 또 다른 질문을 시작할 것이다. –

+0

그것을 알아 냈습니다. 도와 주셔서 다시 한 번 감사드립니다. –

0
List<Stops> stop = lstRoutes.Find(delegate(List<Stops> stp) { return stp.param1 > 6; }); 
+0

답장을 보내 주셔서 감사합니다.하지만이 기능을 사용할 수 없었습니다. 다음 오류가 나타납니다. 'System.Collections.Generic.List '에 'param1'에 대한 정의가없고 'Stops'유형의 첫 번째 인수를 허용하는 확장 메서드 'param1'을 찾을 수 없습니다. –