我有一个gridview,每行显示MyCustomType
的一个实例。实例本身存储在DataGridViewRow的Tag
属性中。现在我想使用linq根据多个条件选择某些行。这看起来像这样:
var rows = grid_series.Rows
.Cast<DataGridViewRow>()
.Where(x => ((MyCustomType)x).myProperty != string.Empty)
.Where(x => ((MyCustomType)x).myOtherProperty < 42);
但我真的想避免在每个Tag
语句中强制转换where
- 对象。有没有办法只对对象施放一次并反复使用?我想过先使用select语句。然后我必须只应用一次演员,但是我必须将每个结果“重新转换”回DataGridViewRow
,这是我认为不可能的。
答案 0 :(得分:3)
之后如何选择Tag
并执行另一个Cast
(或OfType<>
并非所有行包含MyCustomType
):
var rows = grid_series.Rows
.Cast<DataGridViewRow>().Select(r => r.Tag).Cast<MyCustomType>()
.Where(x => x.myProperty != string.Empty)
.Where(x => x.myOtherProperty < 42);
如果您想要IEnumerable<DataGridViewRow>
,可以尝试:
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);