LINQ: Comment déclarer IEnumerable[AnonymousType]?
C'est ma fonction:
private IEnumerable<string> SeachItem(int[] ItemIds)
{
using (var reader = File.OpenText(Application.StartupPath + @"\temp\A_A.tmp"))
{
var myLine = from line in ReadLines(reader)
where line.Length > 1
let id = int.Parse(line.Split('\t')[1])
where ItemIds.Contains(id)
let m = Regex.Match(line, @"^\d+\t(\d+)\t.+?\t(item\\[^\t]+\.ddj)")
where m.Success == true
select new { Text = line, ItemId = id, Path = m.Groups[2].Value };
return myLine;
}
}
J'obtiens une erreur de compilation,car "myLine" n'est pas un IEnumerable[string] et je ne sais pas comment écrire IEnumerable[Anonyme]
"Impossible de convertir implicitement le type de Système.Les Collections.Génériques.IEnumerable[AnonymousType#1]' à 'Système.Les Collections.Génériques.IEnumerable[string]'"
Vous devez vous connecter pour publier un commentaire.
Vous ne pouvez pas déclarer
IEnumerable<AnonymousType>
parce que le type n'a pas (connue) de nom au moment de la construction. Donc, si vous voulez utiliser ce type dans une déclaration de fonction, d'en faire un type normal. Ou tout simplement modifier votre requête pour renvoyer unIENumerable<String>
et le bâton avec ce type.Ou de retour
IEnumerable<KeyValuePair<Int32, String>>
à l'aide de l'instruction select suivante.La signature de la méthode sur
SearchItem
indique que la méthode renvoie unIEnumerable<string>
mais l'anonyme de type déclaré dans votre requête LINQ n'est pas de typestring
. Si vous voulez garder la même signature de la méthode, vous devez modifier votre requête à sélectionner uniquement lesstring
s. par exemple,Si vous insistez sur le retour des données sélectionnées par votre requête, vous pouvez renvoyer une
IEnumerable<object>
si vous remplacez votrereturn
déclaration avecEnsuite, vous pouvez consommer des objets à l'aide de la réflexion.
Mais vraiment, si vous allez à la consommation d'un type anonyme en dehors de la méthode qu'elle est déclarée, vous devez définir une classe d'un avoir de la méthode de retour d'un
IEnumerable
de cette classe. Les types anonymes sont la commodité, mais ils sont soumis à des abus.Je ne suis pas forcément recommander cet...
C'est une sorte de subversion du système de type, mais vous pouvez faire ceci:
1) changer votre signature de la méthode de retour
IEnumerable
(non générique)2) ajouter un cast par exemple helper:
3) puis d'appeler la méthode à quelque chose comme ceci:
Et vous avez terminé.
La clé pour cela est le fait que si vous créez un type anonyme avec le même ordre, les types et les noms de propriété en deux lieux, les types qui peuvent être réutilisées. Sachant cela, vous pouvez utiliser des génériques pour éviter la réflexion.
Espérons que cette aide
Alex
Votre fonction est d'essayer de le retourner IEnumerable<string>, lorsque le LINQ relevé de compte que vous êtes en cours d'exécution est en fait le retour d'un IEnumerable<T> où T est une compilation de type généré. Les types anonymes ne sont pas toujours anonymes, car ils prennent spécifique, type de béton après le code est compilé.
Les types anonymes, cependant, car ils sont éphémères, jusqu'à ce compilé, ne peut être utilisé dans le champ d'application, ils sont créés dans. Pour répondre à vos besoins dans l'exemple que vous avez fournies, je dirais que la solution la plus simple est de créer une simple entité qui stocke les résultats de votre requête:
Toutefois, si votre but ultime n'est pas de récupérer un certain type d'objet, et vous êtes uniquement intéressé par, disons, le Chemin...alors vous pouvez toujours générer un IEnumerable<string>:
J'espère que ça aide à clarifier votre compréhension de LINQ, enumerables, et les types anonymes. 🙂
Une chose à retenir, c'est que
LINQ
consolidés exécution différée. Ce que cela signifie est que votreLINQ
déclaration n'a pas fait exécuter jusqu'à ce que vous itérer sur elle dans unforeach
déclaration ou que vous appelez la.ToList()
méthode surmyLine
.Pour votre exemple, essayez de changer:
À: