鏈結查詢範例 (C#) (LINQ to XML)
這個範例是以延後執行的範例為基礎,並示範將兩個同時使用延後執行與延遲評估的查詢鏈結在一起時,會發生什麼狀況。
範例:新增第二個擴充方法,讓它使用 yield return
來延後執行
此範例介紹另一個擴充方法 AppendString
,它會將指定的字串附加到來源集合中的每個字串,然後產生變更的字串。
public static class LocalExtensions
{
public static IEnumerable<string>
ConvertCollectionToUpperCase(this IEnumerable<string> source)
{
foreach (string str in source)
{
Console.WriteLine("ToUpper: source >{0}<", str);
yield return str.ToUpper();
}
}
public static IEnumerable<string>
AppendString(this IEnumerable<string> source, string stringToAppend)
{
foreach (string str in source)
{
Console.WriteLine("AppendString: source >{0}<", str);
yield return str + stringToAppend;
}
}
}
class Program
{
static void Main(string[] args)
{
string[] stringArray = { "abc", "def", "ghi" };
IEnumerable<string> q1 =
from s in stringArray.ConvertCollectionToUpperCase()
select s;
IEnumerable<string> q2 =
from s in q1.AppendString("!!!")
select s;
foreach (string str in q2)
{
Console.WriteLine("Main: str >{0}<", str);
Console.WriteLine();
}
}
}
這個範例會產生下列輸出:
ToUpper: source >abc<
AppendString: source >ABC<
Main: str >ABC!!!<
ToUpper: source >def<
AppendString: source >DEF<
Main: str >DEF!!!<
ToUpper: source >ghi<
AppendString: source >GHI<
Main: str >GHI!!!<
在此範例中,您可以看到每個擴充方法會針對來源集合中的每個項目,一次運算一個。
從這個範例應該清楚知道的是,即使我們已經將產生集合的查詢鏈結在一起,還是不會具體化任何中繼集合。 但是,每個項目都會從一個延遲方法傳遞到下一個延遲方法。 這會使記憶體使用量比先取得一個字串陣列,然後建立已經轉換為大寫的另一個字串陣列,最後建立每個字串都已經附加驚嘆號的第三個字串陣列這種方法小很多。
本教學課程中的下一篇文章會說明中繼具體化: