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



我有一个网格视图,每行显示一个MyCustomType实例。实例本身存储在DataGridViewRow的Tag属性中。现在我想使用linq根据多个条件来选择某些行。这看起来像这样:

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

但我确实希望避免在每个where语句中强制转换Tag-对象。有没有一种方法可以只投射一次对象并重复使用?我想先使用select语句。然后我只需要应用一次强制转换,但之后我必须将每个结果"重新转换"回DataGridViewRow,我认为这是不可能的。

选择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);

相关内容

最新更新