2010-06-18 2 views
78

.Net에서 정의 된 기본 방법이 C#의 경우 목록 내의 모든 요소를 ​​제거하려면 null입니까?한 번에 일반 목록의 모든 null 요소를 제거하는 방법은 무엇입니까?

List<EmailParameterClass> parameterList = new List<EmailParameterClass>{param1, param2, param3...}; 

일부 매개 변수는 null입니다. 미리 알 수는 없으므로 목록에서 제거하여 null이 아닌 매개 변수 만 포함하도록하고 싶습니다.

답변

160

아마도 다음을 원할 것입니다.

List<EmailParameterClass> parameterList = new List<EmailParameterClass>{param1, param2, param3...}; 
parameterList.RemoveAll(item => item == null); 
+1

긍정이 내 대답하지만 새로운 C# 3 람다 구문을 사용하는 것과 동일하다. –

+0

@ 마크 : 게시 된 초를 보았고 남자가 가까웠습니다 (32, 33, 34). ;) – Lance

+0

Ha :) 글쎄, 페어 플레이 - 당신의 대답은 깔끔한 문법을 ​​사용했습니다. +1 –

21

removeAll 메 방법은 트릭을 수행해야합니다

parameterList.RemoveAll(delegate (object o) { return o == null; }); 
+0

람다를 사용하지 않는 이유는 무엇입니까? –

+8

이것은 4 년 된 답변입니다. 그 당시 C# 3은 비교적 새로운 것이었고 나는 여전히 C# 2를 매일 사용하고있었습니다. 람다 구문은 이제 갈 길입니다. 그러나 이것은 여전히 ​​작동하는 대답이므로 어떤 이유로 든 새로운 구문을 사용할 수없는 사람을 위해 여기에 두었습니다. –

+2

나는 람다 구문이 나중에 나왔다는 것을 알지 못했다. 설명해 주셔서 감사합니다! 의심의 여지없이 그것은 유효합니다. –

28

난 어떤 내장 방법을 모르는,하지만 당신은 그냥 LINQ 사용할 수 있습니다

parameterList = parameterList.Where(x => x != null).ToList(); 
+2

불필요하게 새로운 복사본을 생성하기 때문에'parameterList'가 이미 List 인 경우에는이 작업을 피해야합니다. 이 경우 다른 사람들이 제안하는 것처럼'RemoveAll' 메소드를 사용하십시오. – Nick

+0

콜렉션이'Array' 인 경우이 옵션이 가장 좋습니다. – Andrew

3
List<EmailParameterClass> parameterList = new List<EmailParameterClass>{param1, param2, param3...}; 

parameterList = parameterList.Where(param => param != null).ToList(); 
2

OfType() 메서드는 null 값을 건너 뜁니다.

List<EmailParameterClass> parameterList = 
    new List<EmailParameterClass>{param1, param2, param3...}; 

IList<EmailParameterClass> parameterList_notnull = 
    parameterList.OfType<EmailParameterClass>(); 
+0

어떤 식 으로든 이것은 좋은 접근 방법이지만 'OfType'이 'null'값을 포함하지 않을 것이라고 생각하지 않고 특정 유형의 객체를 선택한다고 생각하는 개발자에게 놀라움을 가져다줍니다. 이것을 내 자신의 코드에 소개하기에 약간 지쳤습니다. –

+0

@ BjörnAliGöransson 동의 함. 흥미로운 해결책이지만, "읽기"가 매우 명확하지 않습니다. .RemoveAll을 람다와 함께 사용하면 모든 것을 한 줄로 유지하면서 작성한 개발자가 성취하려고 시도했던 것이 무엇인지 분명하게 알 수 있습니다. 그러나 속도면에서 장점이 있다면 유용 할 수 있습니다. – MattD

1

쉽고없이 LINQ :

while (parameterList.Remove(null)) {}; 
+0

그 메소드는'RemoveAll' 바로 옆에있는'List' 클래스에 있습니다. 따라서이 메소드는 명확성을 위해 추천 할 것입니다. 퍼포먼스가 중요하다면이 접근법을 사용할 수 있습니다 (대괄호를 제거하고 알 수없는 개발자에게 주석을 추가 할 수도 있음). – Andrew

+0

@Andrew : MSDN에 따르면 RemoveAll은 null을 취하지 않습니다. 나는 또한 그것을 테스트했다고 생각합니다. 의견은 이해가됩니다. –

+0

'RemoveAll'은'Predicate'를 받았으니, Accept Bell Bell의 대답에서 볼 수 있듯이'RemoveAll (x => x == null)'을 사용해야합니다. – Andrew

관련 문제