随笔 - 410
文章 - 0
评论 - 519
阅读 -
148万
随笔分类 - C#基础
常用的去重和排序
摘要:去重和排序是开发过程中经常碰到的问题,这篇文章就来总结一下。 去重 方法1:使用内置的distinct 代码如下: //方法1:使用默认的distinct方法 //只能针对基元类型列表,对于自定义类型组合字段条件需要自定义相等比较器实现IEqualityComparer接口,比较麻烦 var result1 = list.Distinct().ToList(); 方法2:使用GroupBy 代码...
阅读全文
string to byte[]
摘要:在平常的开发过程中,经常碰到需要将string转化成byte[]字节数组的情形,有两种方法,在这里总结一下。 使用MemoryStream 代码如下。 1 using (MemoryStream sb = new MemoryStream()) 2 { 3 using (var writer = new ...
阅读全文
json序列化时datetime的处理方法
摘要:.net自带的json序列化器,JavaScriptSerializer和DataContractJsonSerializer,都是序列化成微软的datetime json格式,e.g. "\/Date(1198908717056)\/" 如果你将json序列化器换成json.net,可能会碰到序列化datetime格式的问题。 json.net的行为是这样的。 4.5,序列化成ISO标准时...
阅读全文
dll版本冲突的解决方法
摘要:问题描述 当运行站点或者控制台等程序时,如果项目引用的dll版本与其它dll所依赖的dll版本不一致,就会报未能加载程序集的错误。错误信息为: 未能加载文件或程序集“Newtonsoft.Json, Version=4.5.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed”或它的某一个依赖项。找到的程序集清单定义与程序集引用不匹配。 (...
阅读全文
.net中的序列化
摘要:常见的序列化格式和方法 在.net中,常见的序列化格式主要有json,二进制和xml,总结如下表格。 注意事项 关于实体特性标注规则: 1,.net中所有用于序列化的实体的class上应该加上[Serializable]标记,如果不加的话,json序列化的时候没有问题,但是使用BinaryFormatter进行二进制序列化的时候就会报错。 2,如果应用在wcf中,所有实体的class...
阅读全文
.net中如何发送HTTP请求网络资源
摘要:应用场景 应该说只要是需要通过发送Http请求获取网络资源的地方都要使用它,网络资源可以是指以URI来表示的资源,比如web api接口等。 HttpWebRequest .net2.0 ~ .net4.0使用HttpWebRequest 代码如下: 1 //.net2.0 ~ .net4.0使用HttpWebRequest 2 va...
阅读全文
基于任务的异步模式(TAP)
摘要:Task .net 4.0为我们带来了Task的异步,我们有以下三种方法创建Task。 1,Task.Factory.StartNew,比较常用。 2,Task.Run,是.net 4.5中增加的。 3,Task.FromResult,如果结果是已计算,就可以使用这种方法来创建任务。 下面就以Task.Factory.StartNew继续来实现前面的那个例子,代码如下。 ...
阅读全文
基于事件的异步模式(EAP)
摘要:什么是EAP异步编程模式 EAP基于事件的异步模式是.net 2.0提出来的,实现了基于事件的异步模式的类将具有一个或者多个以Async为后缀的方法和对应的Completed事件,并且这些类都支持异步方法的取消、进度报告和报告结果。然而.net中并不是所有的类都支持EAP,总结起来有以下17个类支持EAP异步。 System.Object的派生类型: System.Activies.Wo...
阅读全文
异步编程模型(APM)模式
摘要:什么是APM .net 1.0时期就提出的一种异步模式,并且基于IAsyncResult接口实现BeginXXX和EndXXX类似的方法。 .net中有很多类实现了该模式(比如HttpWebRequest),同时我们也可以自定义类来实现APM模式(继承IAsyncResult接口并且实现BeginXXX和EndXXX方法),下面的Demo就以HttpWebRequest类来实现APM模式的异步...
阅读全文
Task
摘要:.net 4.0为我们带来了TPL(Task Parallel Library),其中Task相较ThreadPool线程池使用更简单,而且支持线程的取消,完成和失败通知等交互性操作,而这些是ThreadPool所没有的。并且Task是可以有返回值的。 传参 给异步方法传参,可以使用以下几种方法。 1 new Thread(Go1).Start("arg1");//最...
阅读全文
线程池
摘要:线程池与线程的不同 线程的创建是比较占用资源的一件事情,.NET 为我们提供了线程池来帮助我们创建和管理线程。Task是默认会直接使用线程池,但是Thread不会。如果我们不使用Task,又想用线程池的话,可以使用ThreadPool类。 Demo 上代码。 1 using System; 2 using System.Collections.Generic; ...
阅读全文
线程
摘要:AppDomain,进程和线程的关系 还是用图来说明比较容易理解。 可以总结为以下几句话。 1,进程可以理解为程序(.exe)的实例。线程可以理解为一个虚拟的CPU。 2,一个进程可包含多个线程和多个Appdomain。 3,一个线程可以穿梭在多个Appdomain中,但在同一时刻,线程只会处在其中一个Appdomain中。 前台线程和后台线程 1,前台线程和后台线程的区别在...
阅读全文
多线程系列(4)使用多线程的安全问题
摘要:在使用多线程的时候,往往存在一定的公共数据,为了避免多个线程同时操作同一数据,我们需要为线程加锁。加锁的原理:每一个引用类型的对象都有一个同步索引块,指示当前使用该对象的线程数,每个线程执行到Lock语句块的时候就会判断当前锁定项(这里是this,当前窗体对象)的同步索引块是否等于0(即没有线程...
阅读全文
多线程系列(3)任务Task
摘要:虽然使用线程池ThreadPool让我们使用多线程变得容易,但是因为是由系统来分配的,如果想对线程做精细的控制就不太容易了,比如某个线程结束后执行一个回调方法。恰好Task可以实现这样的需求。这篇文章我从以下几点对Task进行总结。认识TaskTask的用法认识TaskTask类在命名空间Sys...
阅读全文
多线程系列(2)线程池ThreadPool
摘要:上一篇文章我们总结了多线程最基础的知识点Thread,我们知道了如何开启一个新的异步线程去做一些事情。可是当我们要开启很多线程的时候,如果仍然使用Thread我们需要去管理每一个线程的启动,挂起和终止,显然是很麻烦的一件事情。还好.net framework为我们提供了线程池ThreadPool...
阅读全文
多线程系列(1)多线程基础和Thread
摘要:因为现项目中有用到多线程和并发的知识,所以打算近期补习一下多线程相关的内容。第一篇文章从最基础的开始,就是如何开启一个线程,如何启动线程和阻塞线程等,这篇文章分以下几点进行总结。多线程初印象多线程的使用场景线程的启动,挂起和终止一个简单的多线程实例多线程初印象 首先通过一张图来了解一下进程Pr...
阅读全文
字符串按首字母分组并ToDictionary的实现
摘要:这是一道面试题目,要求实现字符串按首字母分组并ToDictionary输出,当时没有做出来,后面研究了一下,现在将这道题的几种实现方式记录下来。 首先初始化数据源,是一个List<string>对象。如下代码。 第一种分组方法,使用正则表达式,代码如下。 第二种方法,直接比较两个char,代码如下。
阅读全文
LINQ to Objects系列(4)表达式树
摘要:为了进一步加深对Lambda表达式的理解,我们需要掌握一个新的知识,Lambda表达式树,可能听名字看起来很高深和难以理解,但实际上理解起来并没有想象中那么难,这篇文章我想分以下几点进行总结。1,表达式树的语法2,将代码转换到数据3,探索表达式树4,将数据转换到代码5,IQueryable和表达...
阅读全文
LINQ to Objects系列(3)深入理解Lambda表达式
摘要:Lambda表达式是学好LINQ很重要的一个知识点,后面的LINQ查询中会大量地使用到Lambda表达式。这篇文章从以下几点进行总结。1,Lambda表达式的前世今生2,Lambda表达式的实际运用Lambda表达式的前世今生在没有Lambda表达式之前,我们一般使用原始方法或匿名方法来创建委托...
阅读全文