1

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

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

但我真的想避免Tag在每个where语句中都使用 -object。有没有办法只投射对象一次并重复使用?我考虑过首先使用 select 语句。然后我必须只应用一次演员表,但是我必须将每个结果“重新转换”回DataGridViewRow我认为不可能的结果。

4

1 回答 1

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);
于 2012-09-01T07:03:56.923 回答