0

一連のアイテムに対してExcept操作を実行したいと思います。

コードは次のようになります。

IEnumerable<DataGridViewColumn> dgvColumns = dataGridView.Columns.OfType<DataGridViewColumn>();
IEnumerable<DataColumn> dsColumns = dataSet.Tables[0].Columns.OfType<DataColumn>();

では、dgvColumnsにないdataSet.Tables [0]から列を選択するにはどうすればよいですか?DataGridViewの列はDataSetの列とは異なるタイプであることを知っています。一般的な値のサブセットのみを取得したいと思います。このような:

        var ColumnsInDGV = from c1 in dgvColumns
                           join c2 in dsColumns on c1.DataPropertyName equals c2.ColumnName
                           select new { c1.HeaderText, c1.DataPropertyName, c2.DataType, c1.Visible };

上記のコードは、両方のセットにある「列」を選択します。そこで、DataSetにある別の「列」のセットを作成することを考えました。

  var ColumnsInDS = from c2 in dsColumns select new { HeaderText = c2.ColumnName, DataPropertyName = c2.ColumnName, c2.DataType, Visible = false };

そして今、私はこのようなものを除いて実行できるようになります:

var ColumnsOnlyInDS = ColumnsInDS.Except<ColumnsInDGV>;

しかし、2つのエラーが発生しています。

  1. タイプまたは名前空間の名前'ColumnsInDGV'が見つかりませんでした(usingディレクティブまたはアセンブリ参照がありませんか?)
  2. 暗黙的に型指定されたローカル変数にメソッドグループを割り当てることはできません

したがって、解決策は、クラスを作成してから、暗黙的に型指定されたローカル変数の代わりにそれを使用することです。しかし、この理由だけでクラスを開発することは、必ずしもオーバーヘッドではないと思います。

この問題に対する他の解決策はありますか?

4

1 に答える 1

3

あなたはほとんどそれを持っています。あなたはただ書く必要があります:

// use () to pass a parameter
// type (should) be inferred
var ColumnsOnlyInDS = ColumnsInDS.Except(ColumnsInDGV);

それ以外の:

// do not use <> - that passes a type parameter;
// ColumnsInDGV is not a type
var ColumnsOnlyInDS = ColumnsInDS.Except<ColumnsInDGV>;

更新Except:つまり、 2つのシーケンスのアイテムを比較して等しいかどうかに依存するため、上記は実際には機能しません。明らかに、匿名型はオーバーライドobject.Equalsされていないため、この型で作成する各オブジェクトは個別の値として扱われます。代わりにこれを試してください*:

var dgvColumns = dataGridView.Columns.Cast<DataGridViewColumn>();
var dsColumns = dataSet.Tables[0].Columns;

// This will give you an IEnumerable<DataColumn>
var dsDgvColumns = dgvColumns
    .Where(c => dsColumns.Contains(c.DataPropertyName))
    .Select(c => dsColumns[c.DataPropertyName]);

// Then you can do this
var columnsOnlyInDs = dsColumns.Cast<DataColumn>().Except(dsDgvColumn);

*注:Where上記の式では、指定されたフィルターがすべてのdsDgvColumns結果に適用されるため、より意味があります。それが真である限りフィルターを適用し、それからそれを適用するのをやめます。言い換えれば、あなたがあなたに縛られていないのが最初にいた場合、それはうまくいくでしょう。しかし、それが途中または最後にあった場合はそうではありません。SkipWhileSkipWhileDataGridViewColumnDataSetDataGridView

于 2010-07-22T12:54:48.937 に答える