2012-09-01 4 views
1

난 gridview 있고 각 행 MyCustomType 한 인스턴스를 표시합니다. 인스턴스 자체는 DataGridViewRow의 Tag 속성에 저장됩니다. 이제 linq을 사용하여 여러 기준에 따라 특정 행을 선택하려고합니다.C# : linq에 단 하나의 타입 변환?

var rows = grid_series.Rows 
    .Cast<DataGridViewRow>() 
    .Where(x => ((MyCustomType)x).myProperty != string.Empty) 
    .Where(x => ((MyCustomType)x).myOtherProperty < 42); 

을하지만 난 정말 모든 단일 where 문에서 Tag -object를 캐스팅하지 않으려 :이은 다음과 같습니다. 개체를 한 번만 캐스팅하고 반복적으로 사용하는 방법이 있습니까? 먼저 select 문을 사용하는 방법에 대해 생각했습니다. 그렇다면 캐스트를 한 번만 적용해야하지만 각 결과를 다시 생각해 볼 수없는 DataGridViewRow으로 다시 변환해야합니다.

답변

3

Tag을 선택하고 다른 Cast 할 나중에 (모든 행 또는 OfType<>하는 MyCustomType을 포함)에 대해 무엇 : 당신이 IEnumerable<DataGridViewRow>을 원하는 경우에

var rows = grid_series.Rows 
    .Cast<DataGridViewRow>().Select(r => r.Tag).Cast<MyCustomType>() 
    .Where(x => x.myProperty != string.Empty) 
    .Where(x => x.myOtherProperty < 42); 

당신은 당신이 시도 할 수 있습니다 :

var rows = grid_series.Rows 
    .Cast<DataGridViewRow>() 
    .Select(r => new { MyType = (MyCustomType)r.Tag, Row = r }) 
    .Where(x => x.MyType.myProperty != string.Empty) 
    .Where(x => x.MyType.myOtherProperty < 42) 
    .Select(x => x.Row); 
+0

하지만 결과 유형이 무엇입니까? IEnumerable 가 있어야합니다. 이것은 IEnumerable 을 얻는 것처럼 보입니다. 내가 맞습니까? – Jan

+0

'IEnumerable '를 원한다면 해결책이 더 나을지도 모르겠다. 그러나 나는 나의 대답을 업데이트 할 것이다. – nemesv

+0

위대한, 정확히 내가 무엇을 찾고 있었는지. 고마워요! – Jan