2011-03-29 4 views
0

제 질문은 쉽다고 생각합니다. 저는 C#으로 중분입니다. IEnumerable<Data>이라는 이름의 itemsData은 3 개의 문자열 특성을 포함하는 클래스입니다.람다 식 + IEnumerable + C# + 포함 할 곳 :

public IEnumerable<Data> getDataFiltered(IEnumerable<Data> items,string Filter) 
{ 
    return items.Where(item=>item.Attribute1==Filter); 
} 

그것은

했나 작동 : 여기

내가 사용하지만 때, 나는 속성 1이

public IEnumerable<Data> getDataFiltered(IEnumerable<Data> items,string Filter) 
{ 
    return items.Where(item=>item.Attribute1.Contains(Filter)); 
} 

가 예외를 throw하는 문자열을 포함하는 모든 항목을 얻고 싶은 질문입니다 나는 무엇인가 놓친다?

+0

예외는 무엇입니까? – SLaks

답변

2

또한 적극적으로 속성 1

return items.Where(i => !String.IsNullOrEmpty(i.Attribute1) && i.Attribute1.Contains(filter)); 

에 대한 null 값을 가지고 결과를 필터링한다 . .NET 참조 유형과 값 유형에는 두 가지 유형이 있습니다. 참조 유형 (클래스로 작성된 모든 것)의 기본값은 null입니다. 문자열은 참조 유형의 예입니다.

public class Data 
{ 
    public string Attribute1 { get; set; } 
    public string Attribute2 { get; set; } 
    public string Attribute3 { get; set; } 
} 

위의 코드에서 세 가지 속성 값은 초기화되지 않고 NULL 값을 갖습니다. 'new Data()'를 사용하여 객체의 새 인스턴스를 만들 때 세 속성에 값을 할당하려면 값을 할당하는 생성자를 생성 할 수 있습니다.

public Data() 
{ 
    Attribute1 = Attribute2 = Attribute3 = String.Empty(); 
} 

이제 모든 속성에는 빈 문자열 값이 있습니다. 이것은 초기화되었지만 값이 없음을 의미합니다.

값 유형 (구조체로 정의 된 모든 것)은 NULL 일 수 없습니다. 예를 들어, DateTime, int, double, decimal 등입니다. 숫자 유형의 기본값은 0입니다. DateTime의 기본값은 DateTime.MinValue입니다.

+0

Thanks Nerd :) Very Nice Explanation – Khaldoun

2

Attribute1의 값이 null 인 것으로 가정하고 .Contains를 호출하면 충돌이 발생하고 ==는 그렇지 않을 것으로 가정합니다.

2

Attribute1 일부는 아마도 null 일 수 있습니다.

Contains을 부를 수 없습니다. 이 Consdider

0

:

public IEnumerable<Data> getDataFiltered(IEnumerable<Data> items, string Filter){ 

    return items.Where(item => item != null && item.Contains(Filter)); 
} 

나는 Contains이 Null 참조 호출되지 않았는지 확인하기 위해 무효 검사를 추가했다. String은 경우에 따라 null이 될 수 있음을 나타내는 참조 유형입니다. 당신이 유형의 변수를 만들고 값을 지정하지 않는 한, 그것은 형식에 대한 기본 값을 갖게됩니다 때

+0

컬렉션의 개체가 null 일 가능성이 낮습니다 (가능한 경우). 속성이 초기화되지 않았을 가능성이 큽니다. – NerdFury

+0

@NerdFury : 맞아요, 제가 코드 샘플을 잘못 해석 한 것 같아요 – Dyppl

0

정확한 값을 확인하려면 ==를 사용하십시오. 문자열의 존재 여부를 확인하려면 다음 중 하나를 사용하십시오. 이 경우 민감한 접근 방식에 대한

다음 -

items.Where(item => (item ?? "").Contains(Filter)); 

?C#의 coalesc 연산자입니다. 즉, 첫 번째 값이 아닌 것 같습니다.

그러나 대소 문자를 구분하므로 원하지 않으면 다음과 같은 내용이 포함될 수 있습니다.

items.Where(item => -1 != (item ?? "").IndexOf(Filter, StringComparison .InvariantCultureIgnoreCase));