C#:linq中只有一个类型转换?

时间:2012-09-01 07:00:21

标签: c# linq

我有一个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,这是我认为不可能的。

1 个答案:

答案 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);