2017-07-08 51 views
0

我正在學習使用C#中的數組數據結構。請看看我的代碼。我嘗試在數組OrderBy()方法中擴展lambda表達式和委派,以便完全理解它是如何工作的。但即使運行結果正確,Visual Studio也會出現語法錯誤。如果有人能幫我糾正「代表團3」的一部分,我將不勝感激。謝謝。委託如何在C#中的數組OrderBy方法中工作?

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 

namespace Test2 { 
    class Program { 

     delegate int Del(int i); 

     static void Main(string[] args) { 

      int[] MyArray = new int[5] { 3, 2, 6, 10, -3 }; 

      // print original array 
      foreach (var i in MyArray) { 
       Console.Write(i + " "); 
      } 

      Console.WriteLine(); 
      //Console.ReadKey(); 

      // sort array by using either Linq or OrderBy 
      // Linq works 
      //int[] mynewarray = (from i in MyArray orderby i ascending select i).ToArray(); 

      // delegation 1 works 
      //int[] mynewarray = MyArray.OrderBy(i => i).ToArray(); 
      // delegation 2 works 
      //int[] mynewarray = MyArray.OrderBy(delegate (int i) { return i; }).ToArray(); 
      // delegation 3 has syntax error 
      Del del = MyInt; 
      int[] mynewarray = MyArray.OrderBy(del(int i)).ToArray(); 

      // print sorted array 
      foreach (var i in mynewarray) { 
       Console.Write(i + " "); 
      } 

      Console.ReadKey(); 


     } 
     public static int MyInt(int i) { 
      return i; 
     } 

    } 
} 
+1

'del(int i)'不是c#語法。您應該調用委託'OrderBy(i => del(i))'或將它作爲參數'OrderBy(del)' –

+0

謝謝謝爾蓋。我也試過del(i)。但它仍然給語法錯誤。 –

+0

另一種選擇是'OrderBy(MyInt)' – juharr

回答

1

你需要指定(在這種情況下i)的輸入識別器,並使用「去」(=>)運算符。

選項1:

int[] orderedArray = MyArray.OrderBy(i => del(i)).ToArray(); 

選項2:

int[] orderedArray = MyArray.OrderBy((int i) => del(i)).ToArray(); 
+0

謝謝Aominè。你的建議也可以。是否有可能僅使用委託,而不使用匿名類和Lambda?所以這會幫助我更好地理解。再次感謝。 –

+0

你是什麼意思_是否可以使用委託only_?。委託只是一種指定方法簽名的類型,並引用允許該條件的方法。 –

+0

@ZhongjieFan你的意思是使用匿名方法創建一個委託?即Del d = delegate(int k){/ * ... * /};'? –

0

這是我今天所學。下面是使用委託的一種非常傳統的方式(c#1.0)。這只是幫助我理解委託的一種方式。我實際上想在我的問題中發佈的代碼中使用下面的委託方式。

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 

namespace DelegateDemo_2 { 
    class Program { 

     delegate bool IsTeenAge(Student stud); 

     static void Main(string[] args) { 

      // reference: http://www.tutorialsteacher.com/linq/linq-lambda-expression 

      IsTeenAge isteenage = new IsTeenAge(CheckAge); 
      Student stud1 = new Student() { Age = 17 }; 
      Console.WriteLine(isteenage(stud1)); 

      Console.ReadKey(); 
     } 

     static bool CheckAge(Student s) { 
      return s.Age > 12 && s.Age < 18; 
     } 
    } 
}