none
Cannot apply indexing with [] to an expression of type 'ID3Action'' RRS feed

  • Question

  • Bonjour,

    j'ai eu une erreur que je l'ai pas compris ( je suis nouvelle en c#):

    Cannot apply indexing with [] to an expression of type 'ID3Action''. je vous montre le bout de code :

    ID3Set set1 = new ID3Set(outlookknowledge["Sunny"], temperatureknowledge["Hot"], humidityknowledge["High"], windknowledge["Weak"], playBallAction["No"]); //sous playBallAction["No"] en rouge
    
    
    //avec ID3Set c'est une classe , le code suivant c'est le constructeur de la classse:
    
    public ID3Set(ID3Action _action, params ID3knowledge[] _knowledge)
        { 
            
            _m_action = _action;
            _m_knowledge = new List<ID3knowledge>();
            for (int i =0 ; i < _knowledge.Length; i++)
            {
                _m_knowledge.Add(_knowledge[i]);
            }
        }
    
    
    


    ID3knowledge aussi c'est une classe
    j'ai crée 4 instances de la classe ID3knowledge et une instance de la classe ID3Action:

    ID3knowledge outlookknowledge = new ID3knowledge ("sunny", "overcast", "rain");
    ID3knowledge temperatureknowledge = new ID3knowledge ("hot", "mild", "cool");
    ID3knowledge humidityknowledge = new ID3knowledge ("high", "normal");
    ID3knowledge windknowledge = new ID3knowledge ("weak", "strong");
    
    ID3Action playBallAction = new ID3Action("Yes", "No");// ID3Action  aussi c'est une classe
    //ensuite j'ai fait 
     ID3Set set1 = new ID3Set(outlookknowledge["Sunny"], temperatureknowledge["Hot"], humidityknowledge["High"], windknowledge["Weak"], playBallAction["No"]);
    
    //sous playBallAction["No"] est souligné en rouge

    Vous pouvez m'aider SVP.

    Cordialement

    jeudi 26 juillet 2012 15:02

Toutes les réponses

  • Bonjour,

    Quel est le rapport entre ID3Set et ID3Action ? A priori ID3Action n'hérite pas d'une structure de données indexée et ne définit pas d'indexeur qui permettrait d'adresser une élement avec un "indice" numérique ou alphanumérique. ID3Action représente une action ou une liste d'actions ?

    Cf http://msdn.microsoft.com/fr-fr/library/6x16t2tx(v=vs.80) pour voir ce qu'est un indexeur...


    Please always mark whatever response solved your issue so that the thread is properly marked as "Answered".

    jeudi 26 juillet 2012 15:44
    Modérateur
  • Au fait le rapport c'est que ID3Set répresente un ensemble des attributs( les instances de la classe ID3Knowledge )et une action qui correspond à cet ensemble ( l'action de type ID3Action) , set1 c'est juste une instance de ID3Set mais il y en a 14 set (instance de ID3Set), au dessus je vous ai montré une seul instance juste pour mieux vous expliquer , le fait de dire :

     ID3Set set1 = new ID3Set (outlookknowledge["Sunny"], temperatureknowledge["Hot"], humidityknowledge["High"], windknowledge["Weak"], playBallAction["No"]):

    c'est que l'esemble set1 contient la première proposition: si outlookknowledge prend la valeur sunny et temperatureknowledge prend la valeur Hot et humidityknowledge prend la valeur High ainsi pour windknowledge alors pas de play ball ( c'est le principe de l'algorithme ID3).

    ID3Action réprésente une liste d'actions dans cet exemple on a 2 actions soit "YES" ou "NO" dans un autre exemple peut être une ou plusieurs action ça dépend du cas 

    pour la classe ID3Action voici son code ( peut etre l'erreur ici je doute):

    public class ID3Action  {
     List<string> _m_action;
        public ID3Action(params string[] _action)
        {
    
            _m_action = new List<string>();
            for (int i = 0; i < _action.Length; i++)
            {
                _m_action[i] = _action[i];
            }
        }
        
        
        public List< string>  m_action
        {
            get
            {
                return _m_action;
            }
        }
    }

    peut etre un indexeur qui manque ou...vraiment je ne sais pas, 3 jours je me suis bloquée et je cherche l'erreur.. je vous bien merci pour votre aide

    Cordialement

    jeudi 26 juillet 2012 21:35
  • Bonjour,

    Soit vous utilisez la propriété m_action comme ceci :

    playBallAction.m_action["No"]

    Ou alors vous définissez un indexeur comme ceci dans votre classe ID3Action :

    public class ID3Action  {
     List<string> _m_action;
        public ID3Action(params string[] _action)
        {
    
            _m_action = new List<string>();
            for (int i = 0; i < _action.Length; i++)
            {
                _m_action[i] = _action[i];
            }
        }
        
        
        public string this[int index]
        {
            get
            {
                return _m_action[index];
            }
        }
    }

    Cordialement


    Gilles TOURREAU - MVP C#
    Architecte logiciel/Consultant/Formateur Freelance
    Blog : http://gilles.tourreau.fr
    - MCPD : Enterprise Developper / Windows Developper 3.5 / ASP .NET 3.5/4.0
    - MCITP : SQL Server 2008 Developper
    - MCTS : ADO .NET 3.5 / SQL Server 2008 Developper / Windows Forms 3.5 / ASP .NET 3.5/4.0

    jeudi 26 juillet 2012 22:44
    Modérateur
  • Merci pour votre réponse j'ai utilisé l’indexeur voila l'erreur:

    Error 1 The best overloaded method match for 'ID3Action.this[int]' has some invalid arguments 

    Error 2 Argument 1: cannot convert from 'string' to 'int'

    Error 3 The best overloaded method match for 'ID3Set.ID3Set(ID3Action, params ID3knowledge[])' has some invalid arguments

    même pour la première solution , bcp des erreurs :(

    vendredi 27 juillet 2012 00:22
  • Bonjour,

    En fin de compte je viens de me rendre compte d'un problème conceptuel au niveau de votre classe ID3Action. En effet, vous disposez d'une propriété :

        public List< string>  m_action
        {
            get
            {
                return _m_action;
            }
        }
    

    Cette propriété offre une liste qui est indexable via un entier (int).
    Vous ne pouvez donc pas écrire :

    playBallAction.m_action["No"]

    mais :

    playBallAction.m_action[0]

    Pour accéder au premier élément du tableau.

    Idem avec l'indexeur que je vous propose, il n'est possible d'accéder à une élément que via son index.

    Conceptuellement, pouvez-vous nous dire que doit retourner exactement le code suivant :

    playBallAction["No"]

    Cordialement


    Gilles TOURREAU - MVP C#
    Architecte logiciel/Consultant/Formateur Freelance
    Blog : http://gilles.tourreau.fr
    - MCPD : Enterprise Developper / Windows Developper 3.5 / ASP .NET 3.5/4.0
    - MCITP : SQL Server 2008 Developper
    - MCTS : ADO .NET 3.5 / SQL Server 2008 Developper / Windows Forms 3.5 / ASP .NET 3.5/4.0

    vendredi 27 juillet 2012 07:05
    Modérateur
  • Cela marche pour ID3knowledge ?

    Ce qui m'étonnait aussi est que vous semblez avoir appliquer le bon principe pour ID3knwledge mais pas pour ID3Action ?

    En résumé et un peu grossièrement un indexeur n'est qu'une fonction comme une autre qui va retourner un élement qui correspond à l'index fourni. Si cette "fonction" n'existe pas et que vous tentez de l'utiliser vous obtenez ce message. Prenez peut-être modèle sur ce que vous avez fait pour ID3knowledge qui semble lui fonctionner correctement ?


    Please always mark whatever response solved your issue so that the thread is properly marked as "Answered".

    vendredi 27 juillet 2012 08:23
    Modérateur
  • Bonjour,

    Pourquoi ne pas utiliser un ForEach au lieu d'un for dans votre constructeur ?


    fred on youTube
    PHP MySQL Web Site Creator
    fred

    vendredi 27 juillet 2012 09:07