Beispiel #1
0
        /// <summary>
        /// C# 3.0 增加了 lambda,所以可以使用 lambda 表达式优化匿名函数
        /// </summary>
        public static void LambdaExpressions()
        {
            ComparisonTest tester = (first, second) => first.Length == second.Length;

            Console.WriteLine($"anonymous methods returned: {tester("Hello", "World")}");

            var cities  = new[] { "London", "Madrid" };
            var friends = new[] { "Minnie", "Goofey" };

            Console.WriteLine($"Are friends and cities similar? {AreSimilar(cities, friends, tester)}"); // 使用匿名方法实现的委托
        }
Beispiel #2
0
        static bool AreSimilar(string[] leftItems, string[] rightItems, ComparisonTest tester)
        {
            if (leftItems.Length != rightItems.Length)
                return false;

            for (int i = 0; i < leftItems.Length; i++)
            {
                if (tester(leftItems[i], rightItems[i]) == false)
                {
                    return false;
                }
            }
            return true;
        }
        /// <summary>
        /// Creates a new basic generic operations implementation using the given expression generator.
        /// </summary>
        /// <param name="expressionGenerator">The expression generator that will be used to build the generic methods at run-time.</param>
        public BasicOperations(IExpressionGenerator expressionGenerator)
        {
            if (null == expressionGenerator)
            {
                throw new ArgumentNullException("expressionGenerator");
            }
            Contract.EndContractBlock();
            ExpressionGenerator = expressionGenerator;

            Add      = BuildBinaryFunc("Add");
            Subtract = BuildBinaryFunc("Subtract");
            Multiply = BuildBinaryFunc("Multiply");
            Divide   = BuildBinaryFunc("Divide");
            Negate   = BuildUnaryFunc("Negate");
            Sin      = BuildUnaryFunc("Sin");
            Cos      = BuildUnaryFunc("Cos");
            Tan      = BuildUnaryFunc("Tan");
            Asin     = BuildUnaryFunc("Asin");
            Acos     = BuildUnaryFunc("Acos");
            Atan     = BuildUnaryFunc("Atan");
            Sinh     = BuildUnaryFunc("Sinh");
            Cosh     = BuildUnaryFunc("Cosh");
            Tanh     = BuildUnaryFunc("Tanh");
            Asinh    = BuildUnaryFunc("Asinh");
            Acosh    = BuildUnaryFunc("Acosh");
            Atanh    = BuildUnaryFunc("Atanh");
            Log      = BuildUnaryFunc("Log");
            Log10    = BuildUnaryFunc("Log10");
            Exp      = BuildUnaryFunc("Exp");
            Abs      = BuildUnaryFunc("Abs");
            Atan2    = BuildBinaryFunc <ReverseCoordinates, TValue>("Atan2");
            Pow      = BuildBinaryFunc("Pow");
            Ceiling  = BuildUnaryFunc("Ceiling");
            Floor    = BuildUnaryFunc("Floor");
            Truncate = BuildUnaryFunc("Truncate");
            Min      = BuildBinaryFunc("Min");
            Max      = BuildBinaryFunc("Max");

            Equal          = BuildBinaryFunc <ComparisonTest, bool>("Equal");
            NotEqual       = BuildBinaryFunc <ComparisonTest, bool>("NotEqual");
            Less           = BuildBinaryFunc <ComparisonTest, bool>("Less");
            LessOrEqual    = BuildBinaryFunc <ComparisonTest, bool>("LessEqual");
            Greater        = BuildBinaryFunc <ComparisonTest, bool>("Greater");
            GreaterOrEqual = BuildBinaryFunc <ComparisonTest, bool>("GreaterOrEqual");
            CompareTo      = BuildBinaryFunc <Comparison <TValue>, int>("CompareTo");

            ToDouble            = BuildConversion <TValue, double>();
            FromDouble          = BuildConversion <double, TValue>();
            _zeroValueGenerator = BuildConstant("0");
        }
Beispiel #4
0
        private static void AnonymousMethod()
        {
            string[] cities  = new[] { "London", "Madrid", "TelAviv" };
            string[] friends = new[] { "Minnie", "Goofey", "MickeyM" };

            //Anonymous Method
            ComparisonTest lengthComparer = delegate(string first, string second)
            {
                return(first.Length == second.Length);
            };

            Console.WriteLine("anonymous method returned: {0}", lengthComparer("Hello", "World"));
            PassingAnonymousMethodAsArgument(cities, friends);
        }
Beispiel #5
0
        public delegate bool ComparisonTest(string first, string second); // 使用 delegate 定义委托

        /// <summary>
        /// 直接使用 delegate 关键字来实现委托有一点不好,就是得写一个有命名的方法,有点割裂感
        /// 所以这里使用匿名方法来优化这个步骤
        /// </summary>
        public static void AnonymousMethods()
        {
            ComparisonTest tester = delegate(string first, string second)
            {
                return(first.Length == second.Length);
            };

            Console.WriteLine($"anonymous methods returned: {tester("Hello", "World")}");

            var cities  = new[] { "London", "Madrid" };
            var friends = new[] { "Minnie", "Goofey" };

            Console.WriteLine($"Are friends and cities similar? {AreSimilar(cities, friends, tester)}"); // 使用匿名方法实现的委托
        }
Beispiel #6
0
        private static void UsingDelegates()
        {
            string s1          = "Hello";
            string s2          = "World";
            var    comparators = new StringComparators();

            ComparisonTest test = new ComparisonTest(comparators.CompareContent);

            Console.WriteLine("CompareContent returned: {0}", test(s1, s2));

            test = new ComparisonTest(StringComparators.CompareLength);
            Console.WriteLine("CompareLength returned: {0}", test(s1, s2));

            ComparisonTest test2 = comparators.CompareContent;
        }
        public void ExpressionTestCasesForTranslatedBcl(object[] parameters)
        {
            Func <Configuration> makeConfiguration = () =>
            {
                var c = ComparisonTest.MakeDefaultConfiguration();
                c.Assemblies.TranslateAdditional.Add(Path.Combine(ComparisonTest.JSILFolder, "JSIL.ExpressionInterpreter.dll"));
                return(c);
            };

            RunTestCase(parameters, makeConfiguration,
                        new[]
            {
                Path.GetFullPath(Path.Combine(ComparisonTest.TestSourceFolder, "..", "Libraries",
                                              "JSIL.ExpressionInterpreter.js"))
            });
        }
Beispiel #8
0
        private static bool AreSimilar(string[] leftItems, string[] rightItems, ComparisonTest tester)
        {
            if (leftItems.Length != rightItems.Length)
            {
                return(false);
            }

            for (int i = 0; i < leftItems.Length; i++)
            {
                if (tester(leftItems[i], rightItems[i]) == false)
                {
                    return(false);
                }
            }
            return(true);
        }
        private void RunTestCase(object[] parameters, Func <Configuration> makeConfiguration, IEnumerable <string> additionalFilesToLoad)
        {
            var bootstrapFileName = Path.Combine(
                Path.GetDirectoryName(BootsrapperFileName),
                GetType().Name,
                ComparisonTest.MapSourceFileToTestFile(Path.GetFileName(BootsrapperFileName)));

            RunSingleComparisonTestCase(
                parameters,
                makeConfiguration,
                new JSEvaluationConfig
            {
                ThrowOnUnimplementedExternals = false,
                AdditionalFilesToLoad         =
                    Enumerable.Repeat(bootstrapFileName, 1)
                    .Concat(additionalFilesToLoad ?? Enumerable.Empty <string>())
                    .ToArray()
            }
                );
        }
Beispiel #10
0
        /// <summary>
        /// 使用 delegate 关键字来实现委托
        /// 委托用来表示一个方法的引用,所以可以用来实现高阶函数
        /// 委托编译后其实会生成一个类
        /// </summary>
        public static void DelegateAsParameterType()
        {
            var s1          = "Hello";
            var s2          = "World";
            var comparators = new StringComparators();
            var test        = new ComparisonTest(comparators.CompareContent); // 委托传实例方法参数

            Console.WriteLine($"CompareContent returned: {test(s1, s2)}");

            test = new ComparisonTest(StringComparators.CompareLength); // 委托传静态方法参数
            Console.WriteLine($"CompareLength returned: {test(s1, s2)}");

            test = comparators.CompareContent; // 简化版写法
            Console.WriteLine($"CompareContent returned: {test(s1, s2)}");

            var cities  = new[] { "London", "Madrid" };
            var friends = new[] { "Minnie", "Goofey" };

            test = StringComparators.CompareLength;
            Console.WriteLine($"Are friends and cities similar? {AreSimilar(cities, friends, test)}"); // 使用委托实现高阶函数
        }
 private static Dictionary<IntPtr, string> FindWindowsByCaptionWithTest(ComparisonTest test)
 {
     Dictionary<IntPtr, string> mTitlesList = new Dictionary<IntPtr, string>();
     Dictionary<IntPtr, string> finalList = new Dictionary<IntPtr, string>();
     EnumDelegate enumfunc = (EnumDelegate)delegate(IntPtr hWnd, int lParam)
     {
         string title = GetWindowText(hWnd);
         mTitlesList.Add(hWnd, title);
         return true;
     };
     IntPtr hDesktop = IntPtr.Zero;
     bool success = _EnumDesktopWindows(hDesktop, enumfunc, IntPtr.Zero);
     if (success)
     {
         foreach (var KV in mTitlesList)
         {
             if ((bool)test(KV.Value))
             {
                 finalList.Add(KV.Key, KV.Value);
             }
         }
     }
     return finalList;
 }
Beispiel #12
0
        private static void UsingDelegates()
        {
            string s1 = "Hello";
            string s2 = "World";
            var comperators = new StringComparators();

            ComparisonTest test = new ComparisonTest(comperators.CompareContent);
            Console.WriteLine("CompareContent returned: {0}", test(s1, s2));

            test = new ComparisonTest(StringComparators.CompareLength);
            Console.WriteLine("CompareLength returned: {0}", test(s1, s2));

            ComparisonTest test2 = comperators.CompareContent;
        }
Beispiel #13
0
 private static void IntroducingLambdas()
 {
     ComparisonTest x = (s1, s2) => s1 == s2;
     ComparisonTest y = delegate(string s1, string s2) { return(s1 == s2); };
 }