c# - LINQ sélectionnez à partir de la Collection de

Je suis d'essayer d'écrire une simple Select méthode d'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 je vais avoir:

Première:

  • VS2010 rapports Cannot implicitly convert type 'IEnumerable<RowData>' to 'List<RowData>'. An explicit conversion exists (are you missing a cast?)

OK, d'où la FONTE aller?

Deuxième:

  • Quelqu'un pourrait passer dans un invalide colName valeur (c'est à dire String.IsNullOrEmpty(colName)) ou un paramètre null (object value == null).

Comment pourrais-je gérer la façon dont ma fonction retourne si les paramètres d'entrée ne sont pas valides?

[Résolu]

J'ai édité mon Select déclaration (même rebaptisée par les suggestions ici). J'ai dû utiliser un switch cast vers le type de données que les données, mais il 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 posté ceci sur le même temps que j'ai posté ma solution, et (comme toujours) son code est beaucoup plus agréable.

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 ligne, à certains logiciels développeur de position que je demande, je vais juste faire demi-tour et rentrer à la maison.

@Tout le monde: Merci pour toute l'aide!

LOL... quatre réponses identiques avec @Jon Skeet de poster une réponse 16 secondes d'avance sur @sixlettervariables qui a posté 2 secondes d'avance sur @Justin Niessner, qui était de 16 secondes d'avance sur @alexanderb... c'est incroyable...
Quelque chose me fait penser que je suis absent quelque pièce essentielle du puzzle à faire de ce LINQ travail. Je n'en ai pas vu une explication encore que les clics avec moi. VOODOO je vous dis!

OriginalL'auteur jp2code | 2011-07-12