在c#中使用委托时遇到问题

时间:2015-07-29 22:19:35

标签: c# asp.net delegates

使用委托,我希望IEnumerable项目中的数字5使用以下代码打印到屏幕上;

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using extended;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            IEnumerable<int> cities = new[] { 1, 2, 3, 4, 5 };
            IEnumerable<int> query = cities.StartsWith(hello);

            foreach (var item in query)
            {
                Console.WriteLine(item);
            }
            Console.ReadKey();
        }
        static int hello(int x)
        {
        return x > 4 ? x : 0;
        }
    }
}
namespace extended
{
    public static class A
    {
        public static IEnumerable<T> StartsWith<T>(this IEnumerable<T> input, inputdelegate<T> predicate)
        {
            foreach (var item in input)
            {
                if (item.Equals(predicate))
                {
                    yield return item;
                }
            }
        }
        public delegate int inputdelegate<T>(T input);
    }
}

代码编译没有任何错误,但没有输出到屏幕。知道我可能会出错吗?

1 个答案:

答案 0 :(得分:1)

您没有调用谓词。此外,inputdelegate的返回类型可能应为T.将代码更改为:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using extended;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            IEnumerable<int> cities = new[] { 1, 2, 3, 4, 5 };
            IEnumerable<int> query = cities.StartsWith(hello);

            foreach (var item in query)
            {
                Console.WriteLine(item);
            }
            Console.ReadKey();
        }
        static int hello(int x)
        {
        return x > 4 ? x : 0;
        }
    }
}
namespace extended
{
    public static class A
    {
        public static IEnumerable<T> StartsWith<T>(this IEnumerable<T> input, inputdelegate<T> predicate)
        {
            foreach (var item in input)
            {
                if (item.Equals(predicate(item)))
                {
                    yield return item;
                }
            }
        }
        public delegate T inputdelegate<T>(T input);
    }
}

更新:根据AlexD的评论,您应该考虑将测试更改为:

if (predicate(item))

并将您的代表更新为:

public delegate bool inputdelegate<T>(T input);

并将您的Hello函数更新为:

static bool hello(int x)
{
    return x > 4;
}