2017-05-29 63 views
0

我想知道如果我可以使2运算符重载成一个字典总和,但即时通讯远离正确的模式做到这一点,这是我的代码。字典与运算符超载

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

由于错误消息exp当你试图重载运算符时,运算符重载必须包含至少一个与被传入的类相同类型的参数。通常不会在没有编写的类上重载“+”或任何其他运算符。当然,你可以继承那个类并把你的重载放在那里。但是,当然这只有当至少一个操作数是派生类时才起作用。坦率地说,我怀疑重载字典“+”的价值;操作员没有明显的意义。一个命名方法会更聪明。 –

+0

那我怎么可以用方法来做呢? –

+0

你是什么意思?您只需编写一个方法,并带有两个参数,每个输入字典一个。在你认为是词典的“总和”的方法中做任何事情,然后返回结果。就像其他方法一样。 –

回答

3

这是一个复杂的情况,但我可以给你一些想法,你可以选择最适合你的一个。

首先,如果过载参数列表中 的参数之一,你不能重载操作者不是同一类型的含 类的,因此,如果你在类Polinomio则必须提供的参数中的一个这种类型不是你想要的,因为你正在寻找超载运营商+Dictionary<>类。 提到这个问题here什么是包含类的问题。要解决这个问题是

  1. 一种方法是从Dictionary<>类本身继承。让我们看下面的例子来更好地理解我的意思。

    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; 
        } 
    } 
    
  2. 另一个解决方案是一个扩展方法添加到Dictionary<>类象下面这样:

    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; 
    } 
    

可以调用它象下面:

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

是的,这对我来说非常合适,非常感谢 –

+0

很高兴帮助 –