2013-02-23 162 views
0

代碼:問題與擴展方法

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

namespace LambdaExtensionEx 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      string[] myStrngs = new string[] { "Super","Simple","Okay"}; 
      IEnumerable<string> criteraStrngs = myStrngs.WhereSearch<string>(delegate(string s) 
      { 
       return s.StartsWith("s"); 
      }); 

      string s1 = "dotnet"; 
      int count = s1.GetCount(); 

      Console.ReadLine(); 
     } 
    } 

    public static class MyExtension 
    { 
     public delegate bool Criteria<T>(T Value); 

     public static IEnumerable<T> WhereSearch<T>(this IEnumerable<T> values, Criteria<T> critera) 
     { 
      foreach (T value in values) 
       if (critera(value)) 
        yield return value; 
     } 

     public static int GetCount(this string value) 
     { 
      return value.Count(); 
     } 
    } 
} 

我能夠調用getCount將擴展方法,我在「計數」得到的結果。但WhereSearch不會在任何時候被調用,也不會得到結果。我在做什麼錯誤?

回答

5

如果您想讓它執行,您需要開始枚舉WhereSearch函數返回的結果。原因是因爲此功能yield returnsIEnumerable<T>。 C#編譯器所做的是構建一個狀態機,並且不會立即執行該函數,直到調用代碼開始枚舉結果爲止。

例如:

// The function is not executed at this stage because this function uses 
// yield return to build an IEnumerable<T> 
IEnumerable<string> criteraStrngs = myStrngs.WhereSearch<string>(delegate(string s) 
{ 
    return s.StartsWith("s"); 
}); 
// Here we start enumerating over the result => the code will start executing 
// the function. 
foreach (var item in criteraStrngs) 
{ 
    Console.WriteLine(item); 
} 

又如調用一些的LINQ擴展方法如.ToList()在其實際上將列舉並調用該函數的結果:

IEnumerable<string> criteraStrngs = myStrngs.WhereSearch<string>(delegate(string s) 
{ 
    return s.StartsWith("s"); 
}) 
.ToList(); 

有關更多細節在這種情況下,如何加載懶惰你可以看看following post

0

你的擴展方法類沒有什麼意義 - 爲什麼你不這樣做?

class Program 
{ 
    static void Main(string[] args) 
    { 
     string[] myStrngs = new string[] { "Super", "Simple", "Okay" }; 
     IEnumerable<string> criteraStrngs = myStrngs.Where(x => x.StartsWith("s")); 

     string s1 = "dotnet"; 
     int count = s1.Count(); 

     Console.ReadLine(); 

    } 
} 

正如達林·季米特洛夫如前所述 - 你仍然需要枚舉criteriaStrngs得到一個結果出來了 - 這是發生了什麼事與你原來的代碼。

HTH

+0

我試圖自己實現擴展方法。我知道那裏在哪裏。謝謝回覆 – 2013-02-23 17:12:03