2010-08-13 51 views
2

我不知道我非常理解下面的例子是如何工作的。它來自於C#4.0,在果殼中。C#LINQ/Object Initializers來自C#4.0的簡單例子

class Program 
{ 
    static void Main(string[] args) 
    { 
     string[] names = { "Tom", "Dick", "Harry", "Mary", "Jay" }; 

     IEnumerable<TempProjectionItem> temp = 
      from n in names 
      select new TempProjectionItem 
      { 
       Original = n, 
       Vowelless = n.Replace("a", "").Replace("e", "").Replace("i", "") 
          .Replace("o", "").Replace("u", "") 
      }; 

     IEnumerable<string> query = from item in temp 
            where item.Vowelless.Length > 2 
            select item.Original; 

     foreach (string item in query) 
     { 
      Console.WriteLine(item); 
     } 
    } 

    class TempProjectionItem 
    { 
     public string Original; 
     public string Vowelless; 
    } 
} 

IEnumerable是一個接口,不是嗎?什麼樣的對象是tempquery?爲什麼TempProjectionItem不需要執行IEnumerable

回答

3

TempProjectionItem元件型序列的...就像一個IEnumerable<int>(如List<int>)是int值的序列,而不int本身實施IEnumerable

請注意,有兩個序列接口:System.Collections.IEnumerableSystem.Collections.Generic.IEnumerable<T>。顯然後者是通用的,表示特定類型的序列。所以tempTempProjectionItem元素的序列,querystring元素的序列。

這些都不是真正的集合 - 查詢是懶惰地執行的 - 它只在迭代數據時才被評估(從names開始)。遍歷query涉及迭代temp,然後迭代names

0
IEnumerable is an interface, isn't it? 

是的。實際上,在您的代碼中,您使用的是通用接口IEnumerable<T>

What kind of object is temp and query? 

在你的代碼中,我們可以看到溫度是IEnumerable<TempProjectionItem>類型,而查詢是一個IEnumerable<string>,這兩個來自IEnumerable<T>

Why does TempProjectionItem not need to implement IEnumerable? 

TempProjectionItem不是IEnumerable的,它只是IEnumerable<TempProjectionItem>這是一個「容器」的項目。