c# 技巧之 泛函

泛函/泛型 指的是编译时不需要指定具体的参数类型,可以在运行时动态地赋予某一种数据类型的机制。  相信很多人对泛型并不陌生,像Dictionary,List等结构都属于泛型。有趣的是,一个函数也可以泛化。

假如我们需要些一个函数,这个函数负责某一种逻辑操作(例如排序、求和、个数统计等),而不关心具体要操作的数据类型是什么,那么为了使这个函数变得更通用,就可以写成泛函。

举一个我遇到的简单例子:

项目中经常要写读文件,生成key-value 结构的字典。 每次都写StreamReader 和 Dicitonary 的句子会让人感觉码农真是一份无聊的职业。于是写了一个通用的加载key-value 字典的泛函:

   class Common
    {
        internal static Dictionary<T1, T2> LoadDict<T1, T2>(string file, char sep, bool hasHeader = false, int keyidx=0, int valueidx=1)
        {
            Dictionary<T1, T2> res = new Dictionary<T1, T2>();
            using (StreamReader rd = new StreamReader(file))
            {
                string content = "";
                if (hasHeader)
                    rd.ReadLine();

                while ((content = rd.ReadLine()) != null)
                {
                    string[] words = content.Split(sep);
                    T1 key = (T1) Convert.ChangeType(words[keyidx], typeof(T1));
                    T2 value = (T2)Convert.ChangeType(words[valueidx], typeof(T2));

                    if (!res.ContainsKey(key))
                        res.Add(key, value);
                }
            }

            return res;
        }
    }

这样只要调用Common.LoadDict<string,int>( filename, ...) 就可以了。这个函数就像是一个模板,在运行时再确定要使用什么样的数据类型。

T1 key = (T1) Convert.ChangeType(words[keyidx], typeof(T1));

如果类型操作还有更细致的要求,那么可以这样:

if (typeof(T) == typeof(int))
{ ... }
else if (typeof(T) == typeof(double))
{ ... }
else
 ...
时间: 2024-10-11 23:15:41

c# 技巧之 泛函的相关文章

泛函编程(4)-深入Scala函数类

既然是泛函编程,多了解一下函数自然是免不了的了: 方法(Method)不等于函数(Function) 方法不是函数但可以转化成函数:可以手工转换或者由编译器(compiler)在适当的情况下自动转换.反向转换则不然:函数是无法转换到方法的.先看看下面的例子: 1 scala> def aMethod(x: Int): Int = x + 10 2 aMethod: (x: Int)Int 3 4 scala> val aFunction = (x: Int) => x + 10 5 aF

微信公众平台的最新功能详细介绍与使用技巧!

近日微信官方发布消息,微信公众平台的操作进行了又一次"感天动地"的更新 且听我一一道来 本次主要重要改(Geng)革(Xin)凸显在三个地方 改(Geng)革(Xin)一:图文模版的收藏与使用 这,真的是一个超级实用的功能呀,那么如何使用呢?在哪里找呢? 首先告诉大家,如何收藏图文模板 选中编辑区的部分或者全部素材,然后点击添加模版,图文模板即可收藏成功: 当然,你还可以从外部进行粘贴和复制内容到图文模版. 那么,在哪里找到我收藏的模版呢?? 嗯,就在添加图文模版的旁边啦! 同时,你还

好用不需多说的微信公众号实用技巧,一起来叨叨!

至此军训之际,太阳大大当空照,火热的阳光真是好! 小编的心情也是非常的好,想一想那么多嗮黑了,饿瘦了的小学妹们,终于可以显的我好白好白啦(不是白胖白胖)! 白白瘦瘦的我现在比较容易紧张,一紧张我就...喜欢装逼... 装逼我就想到了微信,想到了微信就忍不住和大家叨叨几个超级牛逼的技巧(⊙o⊙) 牛逼的技巧一:图文封面图的获取 不知道大家是否知道如何获取,如果这个图文的封面图比较的符合你的气质,这个时候你就需要下面这样子做了 首先,在电脑上的浏览器打开文章,右键点击查看源代码 然后,点击[Ctrl

【精品】北京赛车计划冠军定位玩法技巧

車車是一種投資,我們的目標是:細水長流,見好就收,不求日金千金,只求長期穩定!許多人賠本的原因:1. 資金不足,卻大把下注,跟到第4期不出,錢不夠了,心慌了.有人孤注一擲,衝到第5期中了,嚇的半死.有人不敢跟,第5期出號了,氣死, 然後再跟新計劃,沒錢了,郁悶死.這兩種做法都不對,既然是以投資的心態做事,就應該計劃好翻倍的本錢,做到99%的穩賺,狀況不對就要及時止損. 看著連續中,就是不敢跟,最後咬牙跟了,馬上挂了.于是開始哭,我運氣咋這麽差.不買就中,一買就挂.相反,有些人專門等挂,一挂就上,

店铺淘客如何做到单店利润过万的个人实战技巧

大家都对店铺淘客挺感兴趣的吧,所以我就分享一些细节,还有如何批量化操作的,平时比较忙,所以之前早就说写文章的,现在才来写.还有其中有很多也是商业机密,大家也都不愿意分享.这次我是毫无保留的分享给大家了.说的都是实操经验,所以对没有操做过这个项的听起来或许有难度,但是对准备入行,或者已经在操作的朋友至少少让大家摸索两个月的时间,好了也就不废话多说了吧. 先来简单介绍一下店铺淘客是怎么操作的 首先我们需要开一个淘宝店铺,然后用我们的的采集上货软件,最后只用坐等成交,坐等收成就可以,简单说一下大家也许

做预解释题的一点小方法和小技巧

在JavaScript中的函数理解中预解释是一个比较难懂的话题.原理虽然简单,寥寥数言,但其内涵却有深意,精髓难懂.如何在轻松活跃的头脑中将它学会,现在针对我在学习中的一点小窍门给大家分享一下,希望能给大家一些帮助: 万事需遵循"原理"--"预解释"无节操和"this"指向:(可先看例题解析然后结合原理进行学习) (感谢蕾蕾老师给归纳的预解释无节操原理:) 如果函数传参数则先于以下执行,就相当于在函数私有作用域下var了一个变量:根据作用域原理,

Android 代码混淆之部分类不混淆的技巧

在编写Android程序之后,我们通常要代码进行混淆编码,这样才能保证市场上我们的应用不会被别人进行反编译,然后破解,所以此时需要在发布正式版本的时候,有一些类事不能混淆的,比如实现了 Serializable 接口的,否则反序列化时会出错,这种情况下,我们可以简单的通过在proguard.cfg(Eclipse)添加配置来解决: -keepnames class * implements java.io.Serializable -keepclassmembers class * implem

泛函和变分法导引

本文主要内容取自于浙江大学的一篇PPT,作者为Hongxin Zhang.源网页在: http://www.cad.zju.edu.cn/home/zhx/FAVM/1.pdf 问题的起源 我们知道,平面上两点间直线距离最短.然而如何证明呢? 假设l两点坐标分别为(0,0)和(a,b),连接两点之间的曲线方程为f(x),那么曲线在两点间的长度可以写为: $s=\int_{0}^{a}\sqrt{1+y'^2}dx$ 两点间距离最短,即上式取最小值,同时满足约束条件y(0)=0,y(a)=b.这就

Windows 操作小技巧 之一(持续更新)

1.图片批量旋转 通常携带单反去景点排了大量照片回来处理图片时都会遇到很多横竖杂乱排序的图片难以处理的情形.现提供如下技巧进行处理. 1).在文件夹中添加“方向”的排列或分组选项: 2).选择需要进行旋转的全部图片进行批量顺时针旋转或逆时针旋转(取决于图片方向)