4 votes

Comment obtenir une valeur bool en tant qu'objet retourné par les génériques ?

J'ai une structure comme ça.

 public class ExportStructure
    {
        public string issueid { get; set; }
        public string filename {get;set;}
        public bool export { get; set; }
    }
public class ExportStructureManager
    {
        public List<ExportStructure> ExportIntoStructure { get; set; }
        public ExportStructureManager()
        {
            this.ExportIntoStructure = new List<ExportStructure>();
        }
        public ExportStructure AddToStructure(string issueid,string filename,bool exportornot)
        {
            ExportStructure expstr = new ExportStructure();
            expstr.issueid = issueid;
            expstr.filename = filename;
            expstr.export = exportornot;

            this.ExportIntoStructure.Add(expstr);
            return (expstr);
        }
        public bool GetStatusFromStructure(string issuekey)
        {
          return (from p in ExportIntoStructure
                where p.issueid == issuekey
                select p.export));
        }
    }

A partir de celui ci-dessus, je veux exécuter GetStatusFromStructure de manière à ce qu'il me renvoie le export le statut de la propriété. Pour celui-là, j'ai écrit comme ça. Mais il donne une erreur comme

Impossible de convertir implicitement le type 'System.Collections.Generic.IEnumerable' en 'bool'.

à l'adresse select p.export Comment résoudre ce problème ?

12voto

Jon Skeet Points 692016

Le problème est que votre requête récupère une séquence de bool une pour chaque enregistrement correspondant à votre filtre. On peut supposer que vous n'attendez qu'un seul résultat. Single :

return (from p in ExportIntoStructure
        // I assume you meant == rather than =
        where p.issueid == issuekey
        select p.export).Single();

Mais vous devez aussi envisager ce que vous voulez qu'il se passe s'il y a plusieurs résultats ou aucun. Les options sont les suivantes :

  • Single
  • SingleOrDefault
  • First
  • FirstOrDefault
  • Last
  • LastOrDefault

Le choix de l'un ou l'autre dépend du comportement que vous souhaitez obtenir dans ces situations.

Vous pourriez également envisager d'en faire une expression sans querelle :

return ExportIntoStructure.Where(p => p.issueid == issuekey)
                          .Select(p => p.export)
                          .Single();

Ou même de correspondre d'abord à un seul objet, puis à un projet :

return ExportIntoStructure.Single(p => p.issueid == issuekey)
                          .export;

1voto

Yograj Gupta Points 9666

Déclaration de changement

return (from p in ExportIntoStructure
            where p.issueid = issuekey
            select p.export));

à

return (from p in ExportIntoStructure
            where p.issueid == issuekey
            select p.export)).Single();

mais assurez-vous que la clé de l'émission existe, sinon il y aura une exception. ou essayez son défaut.

return (from p in ExportIntoStructure
            where p.issueid == issuekey
            select p.export)).SingleOrDefault();

0voto

Mitja Bonca Points 1881

Ajouter la méthode annonyme FirstOrDefault à la fin de la requête.

return (from p in ExportIntoStructure
            where p.issueid = issuekey
            select p.export)).FirstOrDefault();

La méthode annonyme FirstOrDefault (ou SinlgeOrDefault()) est bonne s'il n'y a pas de résultat, elle retournera null, si vous utilisez un autre First ou Single, s'il n'y a pas de valeur, il y aura une erreur lancée !

0voto

Justin Harvey Points 6105

Changez la fonction en ceci :

    public bool GetStatusFromStructure(string issuekey) 
    { 
        return (from p in ExportIntoStructure 
                where p.issueid = issuekey 
                select p.export).FirstOrDefault()); 
    } 

Mais attention, s'il n'y a pas de correspondance, ce sera la valeur booléenne par défaut, c'est-à-dire false.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X