2016-07-26 87 views
-2
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 

namespace Where_MethodGroup 
{ 
    public delegate List<int> WhereDelegate(List<int> list); 
    class Program :IEnumerable 
    { 
     static void Main(string[] args) 
     { 
      List<int> list = new List<int>(); 
      list.AddRange(new int[] { 1, 2, 3, 4, 5, 6, 7, 8, 9 }); 
      WhereDelegate lessThanFive; 
      lessThanFive = GroupConversionMethod; 
      IEnumerable<int> query = list.Where(lessThanFive); 
      foreach (int i in query) 
      { 
       Console.WriteLine(i); 
      } 
     } 
     public static List<int> GroupConversionMethod(List<int> list1) 
     { 
      Console.WriteLine("Integers less than 5 are :"); 
      foreach (int i in list1) 
      { 
       if (i < 5) 
       { 
        yield return i; 
       } 
      } 
     } 
    } 
} 

我必須通過在where方法中傳遞委託對象來查找少於五個的所有元素。在定義委託對象時,使用要使用的回調函數的方法組轉換語法(通過新運算符定義委託對象)。在Where方法中傳遞委託對象

我在該行收到錯誤:

IEnumerable<int> query = list.Where(lessThanFive) 

但如方法有一些無效的參數,這可能是此錯誤的合理解決?

+0

我在IEnumerable行中發現錯誤 query = list.Where(lessThanFive)that方法有一些無效參數,可能是這個錯誤的合理解決方法? – Ananya

+0

其中,Method是Linq名稱空間中定義的擴展方法,它接收Func類型對象。你不能通過你自己的委託類型 – Saurav

回答

0

你可以嘗試以下方法:

IEnumerable<int> query = list.Where(c => c < 5); 

or 

IEnumerable<int> query = from e in list 
where e < 5 
select e; 
+0

但我必須通過將委託對象傳遞給where方法...你給的代碼是使用lambda表達式...我可以通過委託對象嗎? – Ananya

1

Where statment得到在這種情況下,參數Func<int,bool>。 你需要寫功能得到int和返回truefalse

嘗試是這樣的:

class Program 
{ 
    static void Main(string[] args) 
    { 
     List<int> list = new List<int>(); 
     list.AddRange(new int[] { 1, 2, 3, 4, 5, 6, 7, 8, 9 }); 
     IEnumerable<int> query = list.Where(isInGroup); 
     foreach (int i in query) 
     { 
      Console.WriteLine(i); 
     } 
    } 

    public static bool isInGroup(int elem) 
    { 
     return elem < 5; 
    } 
} 
+0

List list = new List (); 列表。AddRange(new int [] {1,2,3,4,5,6,7,8,9}); WhereDelegate lessThanFive = new WhereDelegate(GroupConversionMethod); // lessThanFive = GroupConversionMethod; IEnumerable query = list.Where(lessThanFive); foreach(int i在查詢中) { Console.WriteLine(i); }} – Ananya

+0

但它仍然給我的錯誤,其中有一些無效參數 – Ananya

+0

靜態無效的主要(字串[] args){ 名單 名單 =新名單(); list.AddRange(new int [] {1,2,3,4,5,6,7,8,9}); WhereDelegate lessThanFive = new WhereDelegate(GroupConversionMethod); IEnumerable query = list.Where(lessThanFive); foreach(int i在查詢中) { Console.WriteLine(i); } } – Ananya

1

的問題是,你正試圖使一個委託這需要作爲參數列表,並返回一個當你用linq Where方法發送一個接一個的元素(所以只有一個整數),並且你期望返回一個bool

如果更改委託的簽名是這樣的,它的工作:

public delegate bool WhereDelegate(int element); 

然後就可以調用它以下列方式:

static void Main(string[] args) 
    { 
     WhereDelegate del = (int element) => element < 5; 
     List<int> list = new List<int>(); 
     list.AddRange(new int[] { 1, 2, 3, 4, 5, 6, 7, 8, 9 }); 
     IEnumerable<int> query = list.Where(x => del(x)); 
    } 

使用lambda操作=>

這相當於寫入方法並將其分配給代理人:

在委託實例化
public static bool Method(int i) 
{ 
    return i < 5; 
} 

則:

WhereDelegate del = Method; 

如果你想爲你指定的(即使它是不是在這種情況下,有必要)使用new關鍵字,你可以寫:

WhereDelegate del = new WhereDelegate((int element) => element < 5); 

WhereDelegate del = new WhereDelegate(Method); 

在創建委託。

+0

但我必須使用方法組轉換語法不使用lambda表達式...可以用plz修改它.. – Ananya

+0

我已經修改了代表,因爲您已經說過 – Ananya

+0

即使您定義了代理從一個lambda表達式,它仍然是一個委託,所以這段代碼完全符合你所要求的@Ananya – meJustAndrew