/// <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)}"); // 使用匿名方法实现的委托 }
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"); }
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); }
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)}"); // 使用匿名方法实现的委托 }
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")) }); }
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() } ); }
/// <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; }
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; }
private static void IntroducingLambdas() { ComparisonTest x = (s1, s2) => s1 == s2; ComparisonTest y = delegate(string s1, string s2) { return(s1 == s2); }; }