2017-05-29 34 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

很高興幫助 –