Je souhaite effectuer une opération Except sur un ensemble d'éléments.LINQ sélectionne les éléments de l'ensemble A qui ne sont pas dans l'ensemble B
codeest comme ceci:
IEnumerable<DataGridViewColumn> dgvColumns = dataGridView.Columns.OfType<DataGridViewColumn>();
IEnumerable<DataColumn> dsColumns = dataSet.Tables[0].Columns.OfType<DataColumn>();
Maintenant, comment sélectionner les colonnes de DataSet.Tables [0] qui ne sont pas en dgvColumns? Je sais que les colonnes de DataGridView sont de type différent de Columns dans DataSet. Je veux ramasser seulement un sous-ensemble de valeurs communes. Comme ceci:
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 };
Le code ci-dessus me sélectionne "colonnes" qui sont dans les deux ensembles. Alors J'pensais je vais créer une autre série de « colonnes » qui sont DataSet:
var ColumnsInDS = from c2 in dsColumns select new { HeaderText = c2.ColumnName, DataPropertyName = c2.ColumnName, c2.DataType, Visible = false };
et maintenant que je serai en mesure de perfrom Sauf comme ceci:
var ColumnsOnlyInDS = ColumnsInDS.Except<ColumnsInDGV>;
Mais je reçois deux erreurs :
- Le type ou le nom namespace « ColumnsInDGV » n'a pas pu être trouvé (vous manque une directive à l'aide ou une référence d'assemblage?)
- ne peut pas affecter la méthode g roup à une variable locale implicitement typée
Donc la solution serait de construire une classe et de l'utiliser à la place de la variable locale implicitement typée. Mais je pense que le développement d'une classe uniquement pour cette raison n'est pas une dépense inutile.
Existe-t-il une autre solution à ce problème?
Merci! La première solution n'a pas fonctionné, aucune erreur de compilation mais a retourné toutes les colonnes. La deuxième solution a fonctionné, après avoir effectué 'var dsDgvColumns = dgvColumns.Select (c => dsColumns [c.DataPropertyName])'; il y a une colonne null dans dsDgvColumns. Peut-être que la raison en est que j'ai une colonne dans DataGridView qui n'est pas dans DataSet.Comment modifier la requête ci-dessus d'une manière que dsDgvColumns ne containt pas les valeurs nulles? – Wodzu
Je l'ai modifié comme ceci pour se débarrasser des nulls. Je ne sais pas si c'est la méthode optimale pour le faire? var dsDgvColumns = dgvColumns.SkipWhile (c => dsColumns [c.DataPropertyName] == null) .Sélectionnez (c => dsColumns [c.DataPropertyName]); – Wodzu
@Wodzu: 'Where' serait plus approprié que' SkipWhile'. Aussi, il m'est venu à l'esprit pourquoi la première solution n'a pas fonctionné. Voir ma modification. –