2010-05-18 2 views
1

Existe-t-il un moyen de détecter si une énumération construite à l'aide de LINQ (à des objets dans ce cas) a été matérialisée ou non? Autre que d'essayer d'inspecter le type de la collection sous-jacente? Plus précisément, puisque enumerable.ToArray() va construire un nouveau tableau même si la collection sous-jacente est déjà un tableau que je cherche un moyen d'éviter ToArray() étant appelé deux fois sur la même collection.Comment détecter si une énumération LINQ est matérialisée?

+1

Est-ce que cela fait partie d'un problème plus important que vous essayez de résoudre? – R0MANARMY

+1

@ R0MANARMY - no. –

Répondre

1

Le dénombrable ne ont une "collection sous-jacente", il être une collection. Essayez de le convertir en un seul et utilisez la référence résultante:

var coll = enumerable as ICollection<T>; 
if (coll != null) { 
    // We have a collection! 
} 
+0

Oui, bien sûr, cette solution ne me lie pas à des implémentations spécifiques de IEnumerable. Merci! –

0

La vérification de "is IEnumerable" peut le faire, il n'y a pas d'autre moyen. Vous ne pouvez cependant pas utiliser la déclaration "var" pour le type de retour - car il "cache" le type. Si vous déclarez un IEnumerable explicite, le compilateur vous indiquera si c'est ce qui est retourné.

+0

Var ne vous cache rien, c'est juste un raccourci pour ne pas avoir à taper le type vous-même. Lorsque le code est compilé, le type sera le type exact qui se serait déclaré. – Femaref

+0

J'ai mis "cacher" entre guillemets pour une raison. Si vous déclarez le type exact que vous souhaitez, le compilateur peut fournir une erreur si vous n'avez pas atteint le type prévu. C'est tout ce que je voulais dire par "se cacher". –

+0

La vérification de 'IEnumerable' n'aide pas puisque c'est ce que j'ai déjà. Peut-être que ma question n'était pas assez claire, mais je veux prendre un 'IEnumerable' et vérifier s'il a été matérialisé (converti en liste ou tableau) ou non. –

Questions connexes