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拡張メソッドを呼び出すことができ、結果は「count」になります。しかし、WhereSearchはいつでも呼び出されておらず、結果も得られていません。私はどんな間違いをしているのですか?

4

2 に答える 2

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);
}

.ToList()別の例は、実際に関数を列挙して呼び出す結果など、いくつかのLINQ拡張メソッドを呼び出すことです。

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

この場合の遅延読み込みの仕組みの詳細については、をご覧くださいfollowing post

于 2013-02-23T16:57:31.020 に答える
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();

    }
}

以前にDarinDimitrovが述べたように、結果を得るには、criteriaStrngsを列挙する必要があります。これが元のコードの誤りです。

HTH

于 2013-02-23T17:08:03.400 に答える