2017-05-29 13 views
0

Ich frage mich, ob ich 2 Wörterbücher Summe in eins mit Operatorüberladung machen kann, aber ich bin weit weg von der richtigen Modus, um es zu tun, hier ist mein Code.Wörterbücher mit Operator überladen

class Program 
    { 
    static void Main(string[] args) 
    { 
     int[] array1key = new int[] { 0, 1, 3, 7 }; 
     int[] array1values = new int[] { 5, 7, -3, 9 }; 

     int[] array2key = new int[] { 0, 2 }; 
     int[] array2values = new int[] { 2, 4 }; 

     Dictionary<int, int> Polinomio1 = new Dictionary<int, int>(); 
     Dictionary<int, int> Polinomio2 = new Dictionary<int, int>(); 

     for (int i = 0; i < array1key.Length; i++) 
     { 
      Polinomio1.Add(array1key[i], array1values[i]); 
     } 
     for (int i = 0; i < array2key.Length; i++) 
     { 
      Polinomio2.Add(array2key[i], array2values[i]); 
     } 
     Dictionary<int, int> Sumar = Polinomio1 + Polinomio2; 
    } 
    } 
    class Polinomio 
    { 
    public Dictionary<int,int> Polinomio1 = new Dictionary<int,int>(); 
    public static Dictionary<int,int> operator + (Dictionary<int,int> 
    Polinomio1,Dictionary<int,int> Polinomio2) 
    { 
     return Polinomio1 + Polinomio2; 
    } 
    } 
+0

Als die Fehlermeldung exp Wenn Sie versuchen, den Operator zu überladen, müssen Operatorüberladungen mindestens einen Parameter vom gleichen Typ wie die übergebene Klasse enthalten. Sie können '+' oder einen anderen Operator in einer Klasse, die Sie nicht geschrieben haben, nicht generell überladen. Sie können diese Klasse natürlich erben und Ihre Überlast dort anlegen. Aber das funktioniert natürlich nur, wenn mindestens einer der Operanden diese abgeleitete Klasse ist. Ehrlich gesagt, bin ich skeptisch gegenüber dem Wert des Überladens von '+' für ein Wörterbuch; Es gibt keine eindeutige Bedeutung für den Betreiber. Eine gut benannte Methode wäre viel schlauer. –

+0

Dann wie könnte ich es mit Methoden machen? –

+0

Was meinst du? Sie schreiben einfach eine Methode mit zwei Parametern, eine für jedes Eingabewörterbuch. Tun Sie, was immer in der Methode ist, die Sie für die "Summe" der Wörterbücher halten, und geben Sie das Ergebnis zurück. Genau wie jede andere Methode. –

Antwort

3

Dies ist eine komplexe Situation, aber ich kann Ihnen eine Idee geben und Sie können die beste für Sie wählen.

Zuerst kann man nicht einen Operator überlasten, wenn einer der Parameter in Parameterliste Überlastung ist nicht die gleiche Art der enthaltenen Klasse, wenn Sie also in der Klasse sind Polinomio müssen Sie einen der Parameter der zur Verfügung stellen Dieser Typ, der Sie nicht wollen, weil Sie suchen, um Operator + für Dictionary<> Klasse zu überlasten. Beziehen Sie sich auf diese Frage here Was ist das Problem für die Klasse zu halten.

  1. Eine Möglichkeit zur Lösung dieses Problem ist von Dictionary<> Klasse selbst erben. Sehen wir uns das Beispiel unten an, um besser zu verstehen, was ich meine.

    class Program 
    { 
        static void Main(string[] args) 
        { 
         //Made those in same size to not throw an exception 
         int[] array1Key = new int[] { 0, 1, 3, 7 }; 
         int[] array1Values = new int[] { 5, 7, -3, 9 }; 
    
         int[] array2Key = new int[] { 0, 2, 3, 4 }; 
         int[] array2Values = new int[] { 2, 4, 4, 8 }; 
    
         //Create Polinomio object which will serve as `Dictionary<>` in this case 
         Polinomio polinomio1 = new Polinomio(); 
         Polinomio polinomio2 = new Polinomio(); 
    
         for (int i = 0; i < array1Key.Length; i++) 
         { 
          polinomio1.Add(array1Key[i], array1Values[i]); 
         } 
         for (int i = 0; i < array2Key.Length; i++) 
         { 
          polinomio2.Add(array2Key[i], array2Values[i]); 
         } 
         Dictionary<int, int> sum = polinomio1 + polinomio2; 
         for (int i = 0; i < sum.Count; i++) 
         { 
          Console.WriteLine($"{sum.Keys.ElementAt(i)} {sum.Values.ElementAt(1)}"); 
         } 
         Console.ReadLine(); 
        } 
    
    } 
    public class Polinomio : Dictionary<int, int> //inheritance 
    { 
        public static Dictionary<int, int> operator +(Polinomio p1, Polinomio p2) 
        { 
         if (p1.Count != p2.Count) 
         { 
          throw new Exception("Not the same Size"); 
         } 
         Dictionary<int, int> dictionaryTemp = new Dictionary<int, int>(); 
         for (int i = 0; i < p1.Count; i++) 
         { 
          dictionaryTemp.Add(p1.Keys.ElementAt(i) + p1.Keys.ElementAt(i), p1.Values.ElementAt(i) + p2.Values.ElementAt(1)); 
         } 
         return dictionaryTemp; 
        } 
    } 
    
    1. Eine andere Lösung ist eine Erweiterung Methode Dictionary<> Klasse hinzuzufügen wie unten:

      public static Dictionary<int, int> Sum(this Dictionary<int, int> p1, Dictionary<int, int> p2) 
      { 
          if (p1.Count != p2.Count) 
          { 
           throw new Exception("Not the same Size"); 
          } 
          Dictionary<int, int> dictionaryTemp = new Dictionary<int, int>(); 
          for (int i = 0; i < p1.Count; i++) 
          { 
           dictionaryTemp.Add(p1.Keys.ElementAt(i) + p1.Keys.ElementAt(i), p1.Values.ElementAt(i) + p2.Values.ElementAt(1)); 
          } 
          return dictionaryTemp; 
      } 
      

Sie können es nennen wie unten :

Dictionary<int, int> sum = polinomio1.Sum(polinomio2); 
for (int i = 0; i < sum.Count; i++) 
{ 
    Console.WriteLine($"{sum.Keys.ElementAt(i)} {sum.Values.ElementAt(1)}"); 
} 
+0

Ja, das hat perfekt für mich funktioniert, vielen Dank –

+0

Froh, dass es geholfen hat –