한 번에 일반 목록 내의 모든 null 요소를 제거하는 방법은 무엇입니까?


112

목록 내의 모든 요소를 ​​제거하기 위해 C # 용 .Net에 정의 된 기본 메서드가 null있습니까?

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

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

답변:


225

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

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

4
네, 이것은 내 대답과 동일하지만 최신 C # 3 람다 구문을 사용합니다.
Mark Bell

@Mark : 게시 된 초를 봤고 그게 다가 왔습니다 (32, 33, 34). ;)
Lance

1
예 ... 당신의 대답은 이전 버전에서도 작동하므로 +1! 그래서 거기, 하! ; Þ
Lance

43

내장 방법은 모르지만 linq를 사용할 수 있습니다.

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

5
parameterList이미 목록 인 경우에는 불필요하게 새 복사본을 생성 하므로 피해야합니다 . 이 경우 RemoveAll다른 사람들이 제안 하는 방법을 사용하십시오 .
Nick

컬렉션이 Array.
Andrew

25

RemoveAll 메서드는 트릭을 수행해야합니다.

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

왜 람다를 사용하지 않습니까?
Mike de Klerk 2014

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

2
람다 구문이 나중에 나왔는지 몰랐습니다. 설명해 주셔서 감사합니다! 의심 할 여지없이 유효합니다.
Mike de Klerk 2014

8

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

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

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

어떤면에서 이것은 좋은 접근 방식이지만 OfType, null값을 포함하지 않을 것이라고 생각하지 않고 특정 유형의 객체 를 선택 한다고 생각하는 개발자에게는 놀랍습니다 ... 내 코드에.

@ BjörnAliGöransson 동의합니다. 흥미로운 솔루션이지만 매우 명확하게 "읽지"않습니다. 람다와 함께 .RemoveAll을 사용하면 모든 것을 한 줄에 유지하면서 그것을 작성한 개발자가 달성하려는 것이 무엇인지를 분명히 알 수 있습니다. 그러나 이는 가치있는 속도 이점이있는 경우 유용 할 수 있습니다.
MattD

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

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

2

쉽고 LINQ없이 :

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

이 방법은 List바로 옆에 있는 클래스 RemoveAll이므로 명확성을 위해이 방법을 권장합니다. 성능이 중요하다면이 접근 방식을 사용할 수 있습니다 (대괄호를 제거하고 알지 못하는 개발자를 위해 주석을 추가 할 것입니다).
Andrew

1
@Andrew : MSDN에 따르면 RemoveAll은 null을 사용하지 않습니다. 나는 또한 그것을 테스트했다고 생각합니다. 그래도 댓글이 의미가 있습니다.
Tobias Knauss

1
RemoveAll를 받았 Predicate으므로 RemoveAll(x => x == null)수락 및 Mark Bell의 답변에서 볼 수 있듯이을 사용해야합니다 .
Andrew

1

또 다른 간단하고 우아한 옵션이 있습니다.

parameters.OfType<EmailParameterClass>();

이것은 유형이 아닌 모든 요소를 ​​제거하여 EmailParameterClass분명히 유형의 요소를 필터링합니다 null.

다음은 테스트입니다.

class Test { }
class Program
{
    static void Main(string[] args)
    {
        var list = new List<Test>();
        list.Add(null);
        Console.WriteLine(list.OfType<Test>().Count());// 0
        list.Add(new Test());
        Console.WriteLine(list.OfType<Test>().Count());// 1
        Test test = null;
        list.Add(test);
        Console.WriteLine(list.OfType<Test>().Count());// 1
        Console.ReadKey();
    }
}

작동할까요? 요소 참조가 여전히 유형이 아니며 EmailParameterClass값이 null?
derHugo

그것은 확실히 할 것이고 나는 당신의 오락을 위해 테스터를 추가했습니다.
Ryan Naccarato
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.