C# excel函数视频教程全集运行结果记录,将记录数据的excel函数视频教程全集作为参数导入到执行excel函数视频教程全集

不多说,直接上代码,winform下button1调用js函数,从html页面获取值,然后JS调用WINFORM的函数,传送获取到的值到winform并通过messagebox的方法show出来。一步到位,和JS调用winform函数的方法都有了。C#的winform下代码如下:[System.Runtime.InteropServices.ComVisible(true)]&&&&public partial class Form1 : Form&&&&{&&&&&&&&&&&&&&&&public Form1()&&&&&&&&{&&&&&&&&&&&&InitializeComponent();&&&&&&&&&&&&webBrowser1.Navigate(Application.StartupPath + @".\edt\index.html");&&&&&&&&&&&&this.webBrowser1.ObjectForScripting =&&&&&&&&}&&&&&&&&//对获取到的UBB编辑器内容进行处理的函数【piikee注】&&&&&&&&public void getContext(string message)&&&&&&&&{&&&&&&&&&&&&MessageBox.Show(message);&&&&&&&&}&&&&&&&&private void button1_Click(object sender, EventArgs e)&&&&&&&&{&&&&&&&&&&&&webBrowser1.Document.InvokeScript("go"); //调用html页面的JS函数来传参数和运行winForm下的函数【www.piikee.net原创】&&&&&&&&}&&&&}webbrowser中html页面的中JS函数代码如下:注意重点: [System.Runtime.InteropServices.ComVisible(true)]和&&this.webBrowser1.ObjectForScripting =这两句是必需品。看得懂的自然看得懂,看不懂的自然看不懂,就不做过多解释,转载请注明来【自萍客小居】http://www.piikee.net。
&&&回复&&&:
北京盛拓优讯信息技术有限公司. 版权所有 京ICP备号 北京市公安局海淀分局网监中心备案编号:10
广播电视节目制作经营许可证(京) 字第1234号 中国互联网协会会员以下试题来自:
填空题C#提供一个默认的无参构造函数,当我实现了另外一个有一个参数的构造函数时,还想保留这个无参数的构造函数。这样我应该写()构造函数。
为您推荐的考试题库
您可能感兴趣的试卷
你可能感兴趣的试题
1.填空题 set()2.填空题 Enum3.填空题 continue4
A.Sort()
B.BinarySearch()
C.Convert()
D.Index()
C.PowerPoint如果你也会C#,那不妨了解下F#(4):了解函数及常用函数
函数式编程其实就是按照数学上的函数运算思想来实现计算机上的运算。虽然我们不需要深入了解数学函数的知识,但应该清楚函数式编程的基础是来自于数学。
例如数学函数f(x) = x^2+x,并没有指定返回值的类型,在数学函数中并不需要关心数值类型和返回值。F#代码为let f x = x ** 2.0 + x,F#代码和数学函数非常类似,其实这就是函数式编程的思想:只考虑用什么进行计算以及计算的结果(或者叫“输入和输出”),并不考虑怎样计算。
其实,你可以把任何程序看成是一系列函数,输入是你鼠标和键盘的操作,输出是程序的运行结果。你不需要关心程序是怎样运行的,这些函数会根据你的输入来输出结果,而其中的算法是以函数的形式,而不是类或者对象。
下面我们就先了解一些函数式编程中函数相关的东西。
了解函数 不可变性
在一个函数中改变了程序的状态(比如在文件中写入数据或者在内存中改变了全局变量)我们称为副作用。像我们使用printfn函数,无论输入是什么,返回值均为unit,但它的副作用是打印文字到屏幕上了。
副作用并不一定不好,但却经常是很多bug的根源。我们分别用命令式和函数式求一组数字的平方和:
letsquare x = x * x letsum1 nums = letmutable total = 0fori innums doletx = square i total &- total + x total letsum2 nums = Seq.sum ( Seq. mapsquare nums)
在sum2中使用了Seq模块中的函数,这些函数将在稍候进行介绍。
可以看出,函数式代码简短了许多,且少了很多变量的声明。而且sum1是顺序执行,若想以并行方式运行则需要更改所有代码,但sum2只需要替换其中的Seq.sum和Seq.map函数。
在我们接触到的非函数式编程语言(包括C#)中,函数和数值总是有一些不同。但在函数式编程语言中,函数也是值。比如,函数可以作为其他函数的参数,也可以作为返回值(即高阶函数)。而这在函数式编程中是非常常见的。
需要注意的是,我们叫“值”而不叫“变量”。因为在函数式编程中声明的东西默认是不可变的。(在F#中不完全如此,是因为F#包含了面向对象编程范式,可以说并非纯函数式编程语言。)
我们看下面以函数作为参数的代码(求一组数字的负值):
& let negate x = -x;; val negate :x:int-& int& List.map negate [ 1..5];; val it :intlist = [ -1; -2; -3; -4; -5]
我们使用函数negate和列表[1..5]作为List.map的参数。
但很多时候我们不需要给函数一个名称,只需使用匿名函数或叫Lambda表达式。在F#中,Lambda表达式为:关键字fun和参数,加上箭头-&和函数体。则上面的代码可以更改为:
List.map (fun i-& - i) [ 1..5];;
我们再看以函数作为返回值的例子,假设我们定义一个powOf函数,输入一个值,返回一个该值求幂的函数:
letpowOf baseValue = ( funexp -& baseValue ** exp) letpowOf2 = powOf 2.0// f(x) = 2^xletpowOf3 = powOf 3.0// f(x) = 3^xpowOf2 8.// 256.0powOf3 8.// 6561.0
其中powOf2即为powOf函数使用参数2返回的函数。其实这里涉及到闭包的内容,就不详细解释了,我们详细函数式编程时可能会再提及。
递归大家都熟悉,只是在F#中声明时,需要添加rec关键字:
let rec fact x = ifx &= 1then1elsex * fact (x- 1) fact 5;; (* val fact : x:int -& int val it : int = 120 *)
其实需要显示声明递归是因为F#的类型推断系统无法在函数声明完成之前确定其类型,而使用rec关键字后,就允许在确定类型前调用该函数。
部分函数:Partial Function
在函数式编程中,还有一个叫Partial Function(暂且叫部分函数吧)的,可以把接收多个参数的函数分解成接收单个参数,即柯里化(Currying)。
我们知道,使用函数printfn打印整数的语句为printfn "%d" i,我们定义一个打印整数的函数:
& letprintInt i = printfn "%d"i;; val printInt : i:int -& unit & letprintInt = printfn "%d";; val printInt : (int -& unit) 符号函数
在F#中,如+ - * /等运算符其实属于内建函数。而我们也可以使用这些符号来自定义符号函数。
我们用符号来重新定义上面的阶乘函数:
let rec (!) x = ifx &= 1then1elsex * !(x - 1) ! 5;; (* val ( ! ) : int -& int val it : int = 120 *)
需要注意的是,符号函数一般需要括号包裹,如果符号函数的参数不止一个,则符号函数是以中缀的方式来使用,例如我们用=~=定义一个验证字符串是否和正则表达式匹配的函数:
open System.Text.RegularE; let(=~=) str (regex : string) = Regex.Match(str, regex).Success "The quick brown fox"=~= "The (.*) fox";; (* val ( =~= ) : string-& string-& boolval it : bool= true*)
而且,符号函数也可以作为高阶函数的参数。
管道符:|&和&|
我们再返回来看上面的平方和函数:
letsum2 nums = Seq.sum ( Seq. mapsquare nums)
假如函数层次非常多,一层包裹一层,则可读性非常差。
在F#定义了如下符号函数
let(|&) x f = f x let(&|) f x = f x
我们称为“正向管道符”和“逆向管道符”。则上面的平方和函数可写作:
letsum2 nums = nums |& Seq. mapsquare |& Seq.sum
&|虽然用得不多,但常用来改变优先级而无需使用括号:
letsum2 nums = Seq.sum &| Seq. mapsquare nums 合成符:&&和&&
我们也可以用函数合成符将多个函数组合成一个函数,合成符也分正向(&&)和逆向(&&)。
let ( &&) f g x = g( fx) let ( &&) f g x = f( gx)
还是以上面的求平方和为例(Seq.map square即是一个部分函数):
letsum2 nums = ( Seq. mapsquare && Seq.sum) nums letsum2 nums = ( Seq.sum && Seq. mapsquare) nums 常用模块函数
在中,我们了解了集合类型。在F#中,为这些集合类型定义了许多函数,分别在集合名称对应的模块中,例如Seq的相关函数位于模块Microsoft.FSharp.Collections.Seq中。而这也是我们最常用到的模块。
模块(module)是F#中组织代码的一种方式,类似于命令空间(namespace)。但F#中也是有命名空间的,其间的区别将在下一篇介绍。
下面简单介绍常用的函数,并会列出与.Net的System.Linq中对应的函数。
如无特别说明,该函数在三个模块中均可用,但因为集合的实现方式不同,函数的复杂度也会有区别,在使用中根据实际情况选择合适的函数。
对应于Linq中的Count。即获得集合中元素的个数。
[ 1..10] |& List.; // 10Seq. length { 1..100};; // 100
虽然在Seq中也有length函数,但谨慎使用,因为Seq可能为无限序列。
exists 和 exists2
exists用于判断集合是否存在符合给定条件的元素,对应于Linq中的Any。而exists2用于判断两个集合是否包含在同一位置且符合给定条件的一对元素。
List.exists ((=) 3) [ 1; 3; 5; 7];; //trueSeq.exists ( funn1 n2 -& n1=n2) { 1..5} { 5.. -1..1};; //true
第一行代码判断列表中是否包含等于3的元素,其中(=) 3即为部分函数,注意=为符号函数。
第二行代码判断两个序列中,因为{1;2;3;4;5}和{5;4;3;2;1}在索引2的位置存在元素符合函数(fun n1 n2 -& n1=n2),所以返回true。
forall 和 forall2
forall检查是否集合中所有元素均满足指定条件,对应Linq中的All。
letnums = { 2..2. .10} nums |& Seq.forall ( funn -& n % 2= 0);; //true
而forall2和exists2类似,但当且仅当所有元素都满足相同位置且符合给定条件才返回true。接上一个代码片段:
letnums2 = { 12..2. .20} Seq.forall2 ( funn n2 -& n + 10= n2) nums nums2;; //truefind 和 findIndex
find查找符合条件的第一个元素,对应Linq中的First。需要注意的是当不存在符合条件的元素,将引发KeyNotFoundException异常。
Seq. find(fun i-& i% 5 = 0) {1..100};; //5
findIndex则返回符合条件的第一个元素的索引。
map 和 mapi
map对应Linq中的Select,将函数应用于集合中的每个元素,返回值产生一个新的集合。
List. map((*) 2) [ 1..10];; // [2; 4; 6; 8; 10; 12; 14; 16; 18; 20]
mapi与map类似,不过在应用的函数中还需要传入一个整数作为集合的索引。
Seq.mapi( funi x -& x*i) [ 3; 5; 7; 8; 0];; // 将各个元素乘以各自的索引,结果为:[0; 5; 14; 24; 0]iter 和 iteri
iter将函数应用于集合中的每个元素,但函数返回值为unit。功能类似于for循环。
而iteri与mapi一样需要在函数中传入一个索引。
Seq.iteri(fun i x-& printfn "第%d个元素为:%d"i x) [ 3; 5; 7; 8; 0] (* 第 0个元素为: 3第 1个元素为: 5…… *) filter 和 where
F#中filter和where是一样的,对应于Linq中的Where。用于查找符合条件的元素。
{ 1.. 10} |& Seq.filter (fun n -& n%2 = 0);; //valit : se q&int&= se q [2; 4; 6; 8; ...]fold
fold对应Linq中的Aggregate,通过提供初始值,然后将函数逐个应用于每个元素,返回单一值。
Seq.fold ( funacc n -& acc + n) 0{ 1..5};; //15Seq.fold ( funacc n -& acc + string n) ""{ 1..10};; //"12345"
首先,将初始值与第一个元素应用于函数,再将返回值与第二个元素应用于函数,依此类推……
Linq中的Aggregate包含不需要提供初始值的重载,其实F#中也有对应的reduce函数。类似的还有foldBack和reduceBack等逆向操作,这里就不介绍了。
collect对应Linq中的SelectMany,展开集合并返回所有二级集合的元素。
let lists = [ [ 0; 1]; [ 0; 1; 2]; [ 0; 1; 2; 3] ] lists |& List.; //[ 0; 1; 0; 1; 2; 0; 1; 2; 3]
其中id为Operators模块中的函数,它的实现为fun n-&n,即直接对参数进行返回。
append将两个集合类型合并成一个,对应于Linq中的Concat。
& Array.append [| 1; 3; 1; 4|] [| 5; 2; 0|];; val it : int [] = [| 1; 3; 1; 4; 5; 2; 0|] zip 和 zip3
zip函数将两个集合合并到一个里,合并后每个元素是一个二元元组。
let list1 = [ 1..3] let list2 = [ "a"; "b"; "c"] List.zip list1 list2;; // [( 1, "a"); ( 2, "b"); ( 3, "c")]
zip3顾名思义,就是将三个集合合并到一个里。
合并后的长度取决于最短的集合的长度。
rev函数反转一个列表或数组,在Seq模块中没有这个函数。
sort函数基于compare函数(中的“比较”介绍过)对集合中的元素进行排序。
& List.sort [ 1; 3; -2; 2];; val it : intlist= [ -2; 1; 2; 3] 数学函数
Linq中包含Max、Min、Average和Sum等数学函数。F#集合模块中也有对应的函数。
List.max [ 1..10] //10Seq.min { 1..5} //5[ 1..10] |& List. mapfloat|& List.average //5.5List.averageBy float[ 1..10] //5.5[ 0..100] |& Seq.where (fun x -& x % 2&& 0) |& Seq.sum |& printf"0到100中的奇数的和为%i"// 0到100中的奇数的和为2500
需要注意的是,average函数需要集合中的元素支持精确除法(Exact division,即实现了DivideByInt函数的类型。不知道为什么是ByInt。),而F#中又不支持隐式类型转换,所以对int集合求平均值只能先转换为float或float32,或使用averageBy函数。
sum函数的示例代码将中由C#翻译过来的命令示示例代码转换成了函数式的代码。
集合间转换
三种集合类型的对应模块中,均提供转换到(to)另外两种集合类型,和从(of)另外两种类型转换的函数。
如Seq模块,通过Seq.toList和Seq.toArray函数转出;通过Seq.ofList和Seq.ofArray转入。
Seq. toList { 1..5};; //[1; 2; 3; 4; 5]List.ofArray [| 1..5|];; //[1; 2; 3; 4; 5]
函数式编程,核心就是函数的运用。上面介绍的这些在C#中也经常使用到对应的方法,但F#提供的函数非常丰富,大家可通过MSDN了解更多:
因为F#中的List和Array均实现了IEnumarable&T&接口,所以Seq模块的函数也可以接收List类型和Array类型的参数。当然,反之则不行。
到现在为止,我们了解的F#都是在交互窗口中。下一篇我们再简单介绍项目创建和代码组织,即模块相关。
相关文章:
原文地址:http://www.cnblogs.com/hjklin/p/fs-for-cs-dev-4.html
.NET社区新闻,深度好文,微信中搜索dotNET跨平台或扫描二维码关注
责任编辑:
声明:该文观点仅代表作者本人,搜狐号系信息发布平台,搜狐仅提供信息存储空间服务。
今日搜狐热点I'd like to access this function in my c# code, is this possible? so in the end the c++ code would call my function and also apply the struct called "sFrameofData".
//The user supplied function will be called whenever a frame of data arrives.
DLL int Cortex_SetDataHandlerFunc(void (*MyFunction)(sFrameOfData* pFrameOfData));
Would this work perhaps?
[DllImport("Cortex_SDK.dll")]
public extern static int Cortex_SetDataHandlerFunc(ref IntPtr function(ref IntPtr pFrameOfData) );
解决方案 You want to use a delegate that matches the method signature of your "MyFunction" C++ method.
[UnmanagedFunctionPointer(CallingConvenction.Cdecl)]
public delegate void MyFunctionDelegate(IntPtr frame);
[DllImport("Cortex_SDK.dll")]
public extern static int Cortex_SetDataHandlerFunc(
[MarshalAs(UnmanagedType.FunctionPtr)]MyFunctionDelegate functionCallback);
本文地址: &
我想在我的C#code访问此功能,这可能吗?所以最后的C ++ code会叫我的功能,也适用于被称为“sFrameofData”的结构。
C ++ code:
//每当数据帧到达用户提供的函数将被调用。DLL INT Cortex_SetDataHandlerFunc(无效(* MyFunction的)(sFrameOfData * pFrameOfData)); 将这工作吧? C#code: 函数[DllImport(“Cortex_SDK.dll”)]公众的extern静态INT Cortex_SetDataHandlerFunc(REF IntPtr的功能(REF IntPtr的pFrameOfData)); 解决方案 您要使用你的“MyFunction的”C ++方法的方法签名匹配的委托。
[UnmanagedFunctionPointer(CallingConvenction.Cdecl)公共委托无效MyFunctionDelegate(IntPtr的帧);函数[DllImport(“Cortex_SDK.dll”)]公众的extern静态INT Cortex_SetDataHandlerFunc([的MarshalAs(UnmanagedType.FunctionPtr)MyFunctionDelegate functionCallback);
本文地址: &
扫一扫关注IT屋
微信公众号搜索 “ IT屋 ” ,选择关注
与百万开发者在一起
(window.slotbydup = window.slotbydup || []).push({
id: '5828425',
container: s,
size: '300,250',
display: 'inlay-fix'订阅 你的位置: >
> 【已解决】C#中如何把函数当做参数传递到别的函数中
【问题】C#想要传递函数参数,但是参数类型是函数,不知道如何传递。【解决过程】1.找了半天,看到这里:,说到用delegate,但是感觉有点复杂,而且不太像是能方便的解决此处的问题。2.说实话,找了其他一些类似的帖子,还是没太看懂。3. 不过最后还是自己在他们的描述的基础上,自己折腾出来了。 【总结】将函数当做参数,传递到别的函数中,的确是通过代理实现的。总体思路是:1.先建一个delegate的函数,delegateFunc该函数的参数格式,要和你想要传递的那个函数funcToDelegate一致。即,参数个数,参数变量类型,顺序等都一样。2.然后别的某个函数,比如beCalledFunction中,其参数,就可以支持带delegate类型的函数作为参数了。3.然后你在另外的其他的地方,某个函数anotherFunc中,就可以调用该beCalledFunction函数,把原先的funcToDelegate当做参数一样,传递过去了。通过例子,就很容易说明具体是如何操作的了: 原先代码如下:void funcToDelegate(object sender, KeyPressedEventArgs e)
// yyyyyyyyyyyyyyyy
private void anotherFunc(object sender, EventArgs e)
//xxxxxxxxxx
hook.KeyPressed += new EventHandler&KeyPressedEventArgs&(funcToDelegate); // normal one: pass funcToDelegate into some other func
hook.RegisterHotKey(controlKeys, key);
} 加了代理,使得可以将函数作为参数传递,变成了这样:void funcToDelegate(object sender, KeyPressedEventArgs e)
// yyyyyyyyyyyyyyyy
delegate void delegateFunc(object sender, KeyPressedEventArgs e); //(1) here para must same with the above function 'funcToDelegate', which is what you want to delegate, 's para
public void beCalledFunction(ModifierKeys_e paraA, Keys paraB, delegateFunc func) // (2) here para use that above delegate func as para
hook.KeyPressed += new EventHandler&KeyPressedEventArgs&(func);
hook.RegisterHotKey(paraA, paraB);
private void anotherFunc(object sender, EventArgs e)
//xxxxxxxxxx
beCalledFunction(paraA, paraB, funcToDelegate); // (3) now can pass funcToDelegate to another func
} 世上无难事,只怕之前人没有解释清楚,导致后来人看不明白。希望上述的解释,能让后来人看得明白。转载请注明: & 与本文相关的文章
15 queries in 0.236 seconds, using 10.40MB memory

我要回帖

更多关于 excel函数公式大全 的文章

 

随机推荐