随笔分类 - .NET基础
摘要:需要扩展IQueryable<T>,参数包括一个DateTime类型的属性、开始日期、截止日期。 现在可以筛选满足某个日期范围内的集合。比如:
阅读全文
摘要:有这样的两个集合: string[] bigArr = new string[] { "a", "b", "c" };string[] smallArr = new string[] { "a", "b"}; 现在需要判断smallArr是否是bigArr的子集。只要拿着bigArray和small
阅读全文
摘要:我们是否可以把从前端接受的JSON字符串转换成字典集合呢?比如从前端接收:{'size':'10', 'weight':'10kg'}在服务端转换成:[{size:"10"},{weight:"10kg"}]这样的字典集合通过Newtonsoft的DeserializeObject<Dictiona
阅读全文
摘要: 本篇体验扩展StringBuilder使之支持链式方法。这里有一个根据键值集合生成select元素的方法。 以上,html.AppendFormat("<select id=\"{0}\" name=\"{0}\">", id);html.AppendLine();可以对这两个语句封装,
阅读全文
摘要: 使用C#实现加减乘除算法经常被用作新手练习。本篇来分别体验通过委托、接口、匿名方法、泛型委托来实现。 加减乘除拥有相同的参数个数、类型和返回类型,首先想到了使用委托实现。 以上,委托用在了方法层面。如果在类层面,也可用接口封装加减乘除的共性。 委托还可以结合匿名方法一起使用。
阅读全文
摘要: 在函数式编程中,可以把函数看作数据。函数也可以作为参数,函数还可以返回函数。比如,LINQ就是基于函数式编程的。 语句式编程可能这样写: 而使用函数式表达式,可以简化为: 再来看一个过滤和排序的例子: 函数式编程可以写成如下: 或 可见,在LINQ中,一个表达式(函数)的返回
阅读全文
摘要:当应用程序需要和磁盘上的文件打交道的时候,就有了流的概念。流就像架设在应用程序所在内存和磁盘之间的一个管道。 大致思路 → 建立管道 //FileMode.Open打开现有文件,另外还有FileMode.Create, FileMode.Append //FileAccess表示对文件的操作权限Fi
阅读全文
摘要:当使用Entity Framework添加一对多关系数据的时候,通常先添加一的数据,然后再添加多的数据。类似这样: //添加一的数据 var category = new Category{Name="类别1"}; category = context.Categories.Add(category
阅读全文
摘要:场景是这样的:Order下有一个Suppler的集合,即一个订单下可能有多个供应商;Supplier下有一个Product的集合,即对一个供应商采购多个产品。需求是这样的:算出所有订购产品的总价模型这样: public class Order { public int OrderId { get;
阅读全文
摘要:主要是想把日期和其它因素考虑进来。 使用RNGCryptoServiceProvider类创建唯一的最多8位数字符串。 private static string GetUniqueKey() { int maxSize = 8; int minSize = 5; char[] chars = ne
阅读全文
摘要:所谓的动态排序是指支持任意字段、任意升序降序的排序。我们希望在客户端按如下格式写:localhost:8000/api/items?sort=titlelocalhost:8000/api/items?sort=name,titlelocalhost:8000/api/items?sort=-nam...
阅读全文
摘要:在面对相互独立的数据或者相互独立的任务时,也许正是Parallel登场的时候。 比如说有一个盒子的集合,分别让盒子旋转一定的角度。 void RotateBox(IEnumerable boxes, float degree) { Parallel.ForEach(boxes, box => box.Rotate(degree)); } 如果并行任务中的一个任务出现异常,需要...
阅读全文
摘要:本篇体验如何等待所有异步任务完成、等待任意一个异步任务完成,以及异步任务完成时的处理。 等待一组任务的完成使用Task.WhenAll方法。 Task task1 = Task.Delay(TimeSpan.FromSeconds(1)); Task task2 = Task.Delay(TimeSpan.FromSeconds(2)); Task task3 = Task.Delay(...
阅读全文
摘要:在异步编程中,有时候希望把进度展示出来,借助IProgress可以实现。 IProgress只提供了一个方法void Report(T value),通过Report方法把一个T类型的值报告给IProgress,然后IProgress的实现类Progress的构造函数接收类型为Action的形参,通过这个委托让进度显示在UI界面中。 首先写一个方法,使用Report方法报告进度。 ...
阅读全文
摘要:Task.FromResult用来创建一个带返回值的、已完成的Task。 场景一:以同步的方式实现一个异步接口方法 比如有一个接口包含异步方法。 interface IMyInterface { Task DoSthAsync(); } 现在,需要以同步的方式实现该接口方法DoSthAsync,但要返回异步的结果。这正是Task.FromResult的用武之地。 public...
阅读全文
摘要:如果想让程序异步等待一段时间,可以考虑使用Task.Delay方法。 比如,在单元测试中模拟一个异步操作。 static async Task DelayedResult(T result, TimeSpan delay) { await Task.Delay(delay); return result; } 又比如,当我们需要远程下载内容,由于远程服务器的状态未必稳...
阅读全文
摘要:当有大量的数据需要处理或者有大量任务需要完成,而且每块数据或每个任务是彼此独立的,这时候可以考虑使用并行编程。现代计算机都是多核的,并行编程可以提高CPU利用率以提高吞吐量。 Parallel.Invoke形参能接收一个Action数组。 static void Main(string[] args) { Test(); ...
阅读全文
摘要:在.NET异步编程中,通常使用async和await这对黄金搭档,返回类型使用Task或Task。在方法前面加async表示这个方法运行异步,在方法内使用await表示执行一个异步等待。 下面是一个简单例子: static void Main(string[] args) { Doth(); Console....
阅读全文
摘要:我们知道,使用string.Format方法可能会存在装箱的情况。比如如下: static void Main(string[] args) { string s = string.Format("拼接{0}和{1}", 1, 2); Console.WriteLine(s); Conso...
阅读全文
摘要:今天在项目中遇到了使用switch语句判断条件,但问题是条件比较多,大概有几十个条件,满屏幕的case判断,是否有更优雅的写法替代switch语句呢? 假设有这样的一个场景:商场经常会根据情况采取不同的打折方案,如果打折方案比较少,可以考虑使用switch语句作判断。但如果有几十甚至几百种打折方案的时候,用switch语句就不够优雅。 先来一个打折接口。 public inter...
阅读全文