J'essaie d'écrire un simple Select
sur une classe qui hérite de IList
.
public class RowDataCollection : IList<RowData> {
private List<RowData> rowList;
internal RowDataCollection(List<RowData> data) {
rowList = data;
}
// ...
}
public RowDataCollection Rows;
public RowDataCollection Select(string colName, object value) {
List<RowData> rowList = from item in Rows
where item[colName].Value == value
select item;
return new RowDataCollection(rowList);
}
Quelques problèmes que j'ai :
D'abord :
- Rapports VS2010
Cannot implicitly convert type 'IEnumerable<RowData>' to 'List<RowData>'. An explicit conversion exists (are you missing a cast?)
OK, où va le CAST ?
Deuxièmement :
- Quelqu'un pourrait faire passer un message non valide
colName
(c'est-à-direString.IsNullOrEmpty(colName)
) ou un paramètre nul(object value == null)
.
Comment gérer le retour de ma fonction si les paramètres d'entrée ne sont pas valides ?
[Résolu]
J'ai édité mon Select
(je l'ai même renommé selon les suggestions faites ici). J'ai dû utiliser un commutateur pour convertir le type de données dans lequel se trouvaient les données, mais cela fonctionne.
public RowDataCollection SelectRow(string colName, object value) {
if (!String.IsNullOrEmpty(colName) && (value != null) && (0 < Rows.Count)) {
switch (Rows[0][colName].GetValueType()) {
case TableDataType.Boolean:
return new RowDataCollection(Rows.Where(r => (bool)r[colName].Value == (bool)value).ToList());
case TableDataType.Character:
return new RowDataCollection(Rows.Where(r => (char)r[colName].Value == (char)value).ToList());
case TableDataType.DateTime:
return new RowDataCollection(Rows.Where(r => (DateTime)r[colName].Value == (DateTime)value).ToList());
case TableDataType.Decimal:
return new RowDataCollection(Rows.Where(r => (Decimal)r[colName].Value == (Decimal)value).ToList());
case TableDataType.Integer:
return new RowDataCollection(Rows.Where(r => (int)r[colName].Value == (int)value).ToList());
case TableDataType.String:
return new RowDataCollection(Rows.Where(r => r[colName].Value.ToString() == value.ToString()).ToList());
}
}
return null;
}
[Résolu (version courte)]
Jon Skeet a posté ceci à peu près en même temps que ma solution, et (comme toujours) son code est bien plus beau.
public RowDataCollection SelectRow(string colName, object value) {
List<RowData> rowList = Rows.Where(r => r[colName].Value.Equals(value)).ToList();
return new RowDataCollection(rowList);
}
@Jon Skeet : Si jamais je vois votre visage dans la même file d'attente pour un poste de développeur de logiciels auquel je postule, je vais faire demi-tour et rentrer chez moi.
Tout le monde : Merci pour votre aide !