共用方式為


HOW TO:從方法傳回查詢 (C# 程式設計手冊)

更新:2010 年 7 月

這個範例會示範如何從方法傳回查詢做為傳回值以及 out 參數。

任何查詢的型別必須是 IEnumerableIEnumerable<T>,或者是 IQueryable<T> 一類的衍生型別 (Derived Type)。 因此,傳回查詢之方法的任何傳回值或是 out 參數也一定具有該型別。 如果方法會將查詢具體化為具象的 List<T>Array 型別,這時便會被視為將傳回查詢結果,而不是傳回查詢本身。 從方法傳回的查詢變數仍然可以加以撰寫或修改。

範例

在下列範例中,第一個方法會將查詢當做傳回值傳回,第二個方法則會將查詢當做 out 參數傳回。 請注意,這兩種情況都是傳回查詢,而不是傳回查詢結果。

class MQ
{
    // QueryMethhod1 returns a query as its value.
    IEnumerable<string> QueryMethod1(ref int[] ints)
    {
        var intsToStrings = from i in ints
                            where i > 4
                            select i.ToString();
        return intsToStrings;
    }

    // QueryMethod2 returns a query as the value of parameter returnQ.
    void QueryMethod2(ref int[] ints, out IEnumerable<string> returnQ)
    {
        var intsToStrings = from i in ints
                            where i < 4
                            select i.ToString();
        returnQ = intsToStrings;
    }

    static void Main()
    {
        MQ app = new MQ();

        int[] nums = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };

        // QueryMethod1 returns a query as the value of the method.
        var myQuery1 = app.QueryMethod1(ref nums);

        // Query myQuery1 is executed in the following foreach loop.
        Console.WriteLine("Results of executing myQuery1:");
        // Rest the mouse pointer over myQuery1 to see its type.
        foreach (string s in myQuery1)
        {
            Console.WriteLine(s);
        }

        // You also can execute the query returned from QueryMethod1 
        // directly, without using myQuery1.
        Console.WriteLine("\nResults of executing myQuery1 directly:");
        // Rest the mouse pointer over the call to QueryMethod1 to see its
        // return type.
        foreach (string s in app.QueryMethod1(ref nums))
        {
            Console.WriteLine(s);
        }


        IEnumerable<string> myQuery2;
        // QueryMethod2 returns a query as the value of its out parameter.
        app.QueryMethod2(ref nums, out myQuery2);

        // Execute the returned query.
        Console.WriteLine("\nResults of executing myQuery2:");
        foreach (string s in myQuery2)
        {
            Console.WriteLine(s);
        }


        // You can modify a query by using query composition. A saved query
        // is nested inside a new query definition that revises the results
        // of the first query.
        myQuery1 = from item in myQuery1
                   orderby item descending
                   select item;

        // Execute the modified query.
        Console.WriteLine("\nResults of executing modified myQuery1:");
        foreach (string s in myQuery1)
        {
            Console.WriteLine(s);
        }

        // Keep console window open in debug mode.
        Console.WriteLine("Press any key to exit.");
        Console.ReadKey();
    }
} 

編譯程式碼

  • 建立以 .NET Framework 3.5 (含) 以後版本為目標的 Visual Studio 專案。 根據預設,專案有 System.Core.dll 的參考,以及 System.Linq 命名空間的 using 指示詞。

  • 將類別取代為範例中的程式碼。

  • 按 F5 編譯和執行程式。

  • 按任何鍵離開主控台視窗。

請參閱

概念

LINQ 查詢運算式 (C# 程式設計手冊)

變更記錄

日期

記錄

原因

2010 年 7 月

已在範例中加入 QueryMethod2。 已加強說明的註解。

客戶回函。