
C#
文章平均质量分 56
singhwong
C#,UWP,.Net
展开
-
Json、Xml
序列化与反序列化JSON序列化将结果放在内存中将结果保存到本地使用代码创建Json对象(JObject)从.json文件中读取JSON序列化将.net实例对象转换为json字符串。将结果放在内存中 public class Product { public int ProductID { get; set; } public string ProductName { get; set; } public int SupplierID {原创 2021-01-29 14:57:00 · 474 阅读 · 1 评论 -
C#实现人民币大写
直接贴代码: class Program { static void Main(string[] args) { Random r = new Random(); for(int i = 0;i<=10;i++) { double m = r.Next()/100.0; System.Console.WriteLine(原创 2021-01-29 10:26:01 · 724 阅读 · 0 评论 -
实现ICommand接口
public class RelayCommand : ICommand { private readonly Action _execute; private readonly Func<bool> _canExecute; public RelayCommand(Action execute,Func<bool> canExecute) { _execute = execute...原创 2021-01-25 21:54:27 · 582 阅读 · 0 评论 -
单元测试(MSTest)
单元测试其实就是将项目细分为多个最小单元,然后对它们分别进行测试。关于"单元"的说法比较难定型,所谓细分也只是一个相对的逻辑概念。很多时候是与当前项目的具体情况有关。细分的时候有时会以单个类为单元,也有可能以单个窗口为单元。如果将应用程序比喻为一台复杂的机器,其生产过程都有特定的工序。机器有许多的零部件组成,车间先把这些零部件生产出来,最后进行组装。因此,开发者也会考虑到,如果整台机器都组装完成后再进行检测,极有可能遇到很多问题,甚至有些问题很难跟踪查找。要是事先在每个零部件生产出来的时候就进行检验,及原创 2021-01-04 19:45:13 · 2683 阅读 · 0 评论 -
使用日志文件
在讲述使用日志之前,需要了解一些准备知识。首先,要知道应用程序有两个生成版本:Debug版本:该版本带有调试符合,在调试代码的时候应该选择该版本。由于生成了调试相关的信息,因此该版本的应用程序文件的体积较大,执行效率也较低。Release版本:发布版本,当调试完应用程序,确定无误后,就要发布应用程序以供用户使用。该版本生成少量的调试信息,或者不生成调试信息,因而文件体积较小,执行的效率也较高。在项目"属性"-"生成"选项卡里有"定义DEBUG常量"和"定义TRACE常量"两个选项。选中某个选项意原创 2021-01-04 17:47:05 · 312 阅读 · 0 评论 -
断言(Assert)
由于翻译的影响,“断言”在字面意思上不太好理解,直接使用原单词assert可能会更好。Debug类的Assert方法有一些不同的重载,不管是哪个版本的重载,都有一个condition参数,bool类型。Assert方法的功能是:当condition参数为false时候显示错误提示。在了解了Assert方法的功能后,就可以联想到,断言的作用是检验代码的执行是否符合预期的结果。如果不符合(condition参数为false),就表明断言失败,在输出窗口中显示错误提示。示例如下: stati原创 2021-01-03 18:13:04 · 3163 阅读 · 0 评论 -
输出信息法(Debug)
有时候,开发者并不关心对象在运行时的状态,而仅仅需要验证结果是否正确,因此通过输出调试信息来判断代码的执行结果是否符合预期,比起断点调试会更方便。Debug类(位于System.Diagnostics命名空间下)可以帮助开发人员完成与调试相关操作,比如输出调试信息、断言等。而用于输出调试信息的方法有以下几个:Print方法:输出文本信息,该文本信息是带有行结尾符的,也就是说每次输出一行。Write方法:输出调试信息,如果传递给参数的不是字符串类型,则调用该对象的ToString方法以获取字符串表示形原创 2021-01-03 02:23:54 · 612 阅读 · 0 评论 -
在数组中查找元素
在数组中查找元素1. 查找元素的索引数组操作基本上都是由Array类来负责,因而该类也提供了一系列方法来用于在数组中进行查找。这些方法按照查找结果划分,大体可以分为两类,下面将分别介绍。1. 查找元素的索引此种查找方式将返回被查找到的元素的索引,如果未找到,就返回-1。有两种方法可用:第一组是按照单个元素值来查找;第二组方法则比较灵活,可以通过System.Predicate委托来自定义查找过程。如下:第一组:IndexOf() —— 查找指定元素的索引,只要遇到符合条件的元素就停止查找。如原创 2021-01-02 21:28:43 · 19950 阅读 · 0 评论 -
嵌套数组
要注意多维数组和嵌套数组二者之间的区别,嵌套数组也叫数组的数组,或者交错数组。通过以下方式来声明变量:int[3][2] arr;就是数组中的每个元素也是数组,也就是数组里面也包含数组。如: //嵌套数组 char[][] ccs = new char[][] { new char[]{'a','b'}, new char[]{'c','d'},原创 2021-01-02 16:18:24 · 8768 阅读 · 3 评论 -
特性
默认情况下特性是应用于跟随其后的对象的,因此在许多时候,在使用特性时都会省略表示特性目标的关键字。以下是特性应用于目标对象时的完整格式。[<目标>:<特性列表>]特性目标关键字及相关说明:assembly —— 表示特性将应用于当前程序集,通常放在程序集中命名空间或所有类型定义之前。module —— 用于当前模块,该特性用得比较少。field —— 该特性用于字段,如果特性后紧跟着字段的声明代码,则该关键字可以省略。event —— 特性用于事件,默认情况下也可以省原创 2021-01-02 03:41:25 · 138 阅读 · 0 评论 -
用户定义的异常类
上一节创建了一个用户定义的异常。下面介绍有关异常的第二个示例,这个示例称为SolicitColdCall,它包含两个嵌套的try块,说明了如何定义自定义异常类,再从try块中抛出另一个异常。这个示例假定一家销售公司希望有更多的客户。该公司的销售部门打算给一些人打电话,希望他们成为自己的客户。用销售行业的行话来讲,就是“陌生电话”(cold-calling)。为此,应有一个文本文件存储这些陌生人...原创 2020-01-11 00:39:07 · 566 阅读 · 0 评论 -
捕获异常
.NET提供了大量的预定义基类异常对象,本节介绍如何在代码中使用它们捕获错误情况。为了在C#代码中处理可能的错误情况,一般要把程序的相关部分分成3种不同类型的代码块:try块包含的代码组成了程序的正常操作部分,但这部分程序可能遇到某些严重的错误。 catch块包含的代码处理各种错误情况,这些错误是执行tyr块中的代码时遇到的。这个块还可以用于记录错误。 finally块包含的代码清理资源或...原创 2020-01-10 01:51:05 · 916 阅读 · 0 评论 -
错误和异常概述
简介错误的出现并不总是编写应用程序的人的原因,有时应用程序会因为应用程序的最终用户引发的动作或运行代码的环境而发生的错误。无论如何,我们都应预测应用程序中出现的错误,并相应地进行编码。.NET Framework改进了处理错误的方式。C#处理错误的机制可以为每种错误提供自定义处理方式,并把识别错误的代码与处理错误的代码分离开来。无论编码技术有多好,程序都必须能处理可能出现的任何错误。例...原创 2020-01-08 22:01:27 · 256 阅读 · 0 评论 -
并发集合
不变的集合很容易在多个线程中使用,因为它们不能改变。如果希望使用应在多个线程中改变的集合,.NET在名称空间System.Collections.Concurrent中提供了几个线程安全的集合类。线程安全的集合可防止多个线程以相互冲突的方式访问集合。为了对集合进行线程安全的访问,定义了IProducerConsumerCollection<T>接口。这个接口中最重要的方法是TryA...原创 2019-12-17 12:16:47 · 325 阅读 · 0 评论 -
不变的集合(特殊的集合一种)
如果对象可以改变其状态,就很难在多个同时运行的任务中使用。这些集合必须同步。如果对象不能改变其状态,就很容易在多个线程中使用。不能改变的对象称为不变的对象。不能改变的集合称为不变的集合。只读集合和不可变集合,它们有一个很大的差别:只读集合利用可变集合的接口。使用这个接口,不能改变集合。然而,如果有人仍然引用可变的集合,它就仍然可以改变。对于不可变的集合,没有人可以改变这个集合。Immuta...原创 2019-12-17 11:29:00 · 591 阅读 · 0 评论 -
可观察的集合(特殊的集合一种)
如果需要集合中的元素何时删除或添加的信息,就可以使用ObservableCollection<T>类。这个类最初是为WPF定义的,这样UI就可以得知集合的变化,通用Windows应用程序使用它的方式相同。这个类的名称空间是System.Collections.ObjectModel。ObservableCollection<T>类派生自Collection<T&g...原创 2019-12-12 02:32:58 · 315 阅读 · 0 评论 -
处理位的集合(特殊的集合一种)
如果需要处理的数字有许多位,C# 7为此提供了二进制字面量和数字分隔符。处理二进制数据时,还可以使用BitArray类和BitVector32结构。BitArry类位于名称空间System.Collections中,BitVector32结构位于名称空间System.Collections.Specialized中。这两种类型最重要的区别是,BitArray类可以重新设置大小,如果事先不知道需要的...原创 2019-12-12 02:05:04 · 230 阅读 · 0 评论 -
使用二进制运算符
在学习编程时,使用二进制值一直是一个需要理解的重要概念,因为计算机使用0和1。现在,许多人可能已经错过了它的学习,因为他们是使用Blocks、Scratch,甚至可能是使用JavaScript开始学习编程的。在C# 7中,由于使用数字分隔符和二进制字面量,因此二进制值的处理比以前更容易。二进制运算符从C#的第一个版本就开始有了,下面将介绍它们。首先,使用二进制运算符的简单计算开始。方法Si...原创 2019-12-11 06:57:22 · 528 阅读 · 0 评论 -
不同的集合性能
许多集合类都提供了相同的功能,例如,SortedList类和SortedDictionary类的功能几乎完全相同。但是,其性能常常有很多大区别。一个集合使用的内存少,另一个集合的元素检索速度快。在MSDN文档中,集合的方法常常有性能提示,给出了以大写O记号表示的操作事件:O(1) O(log n) O(n)O(1)表示无论集合中有多少数据项,这个操作需要的时间都不变。例如,ArrayL...原创 2019-12-10 05:06:13 · 224 阅读 · 0 评论 -
集
包含不重复元素的集合称为“集(Set)”。.NET Core包含两个集(HashSet<T>和SortedSet<T>),它们都实现ISet<T>接口。HashSet<T>集包含不重复元素的无序列表,SortedSet<T>集包含不重复元素的有序列表。ISet<T>接口提供的方法可以创建合集、交集,或者给出一个集是另一个集...原创 2019-12-10 04:10:28 · 128 阅读 · 0 评论 -
有序字典
SortedDictionary<TKey,TValue>是一个二叉搜索树,其中的元素根据键排序。该键类型必须实现IComparable<Tkey>接口。如果键的类型不能排序,则还可以创建一个实现IComparer<Tkey>接口的比较器,将比较器用作有序字典的构造函数的一个参数。如前所述,SortedDictionary<TKey,TValue>...原创 2019-12-10 03:19:18 · 329 阅读 · 0 评论 -
Lookup类
Dictionary<TKey,TValue>类支持每个键关联一个值。Lookup<TKey,TElement>类非常类似于Dictionary<TKey,TValue>类,但把键映射到一个值集合上。这个类在程序集System.Core中 实现,用System.Linq名称空间定义。Lookup<TKey,TElement>类不能像一般的字典那样...原创 2019-12-10 03:09:37 · 343 阅读 · 0 评论 -
字典
字典表示一种非常复杂的数据结构,这种数据结构允许按照某个键来访问元素。字典也称为映射或散列表。字典的主要特征是能根据键来快速查找值。也可以自由地添加和删除元素,这有点像List<T>类,但没有在内存中移动后续元素的性能开销。键会转化为一个散列。利用散列创建一个数字,它将索引和值关联起来。然后索引包含一个到值的链接。一个索引项可以关联多个值,索引可以存储为一个树形结构。.NET...原创 2019-12-10 02:22:07 · 225 阅读 · 0 评论 -
有序列表
如果需要基于键对所需集合排序,就可以使用SortedList<TKey,TValue>类。这个类按照键给元素排序。这个集合中的值和键都可以使用任意类型。下面的例子创建了一个有序列表,其中键和值都是string类型。默认的构造函数创建了一个空列表,再用Add()方法添加两本书。使用重载的构造函数,可以定义列表的容量,传递实现了ICompare<TKey>接口的对象,该接口...原创 2019-12-08 03:48:46 · 761 阅读 · 0 评论 -
链表
LinkedList<T>是一个双向列表,其元素指向它前面和后面的元素。这样一来,通过移动到下一个元素可以正向遍历整个链表,通过移动到前一个元素可以反向遍历整个链表。链表的优点是,如果将元素插入列表的中间位置,使用链表就会非常的快。在插入一个元素时,只需要修改上一个元素的Next引用和下一个元素的Previous引用,使他们引用所插入的元素。在List<T>类中,插入一...原创 2019-12-06 05:40:18 · 103 阅读 · 0 评论 -
栈
栈是与队列非常类似的另一个容器,只是要使用不同的方法访问栈。最后添加到栈中的元素会最先读取。栈是一个后进先出(LastIn,FirstOut,LIFO)的容器。用Push()方法在栈中添加元素,用Pop()方法获取最近添加的元素。与Queue<T>类相似,Stack<T>类实现IEnumerable<T>和ICollection接口。在下面的例...原创 2019-12-06 01:58:08 · 107 阅读 · 0 评论 -
队列
队列是其元素以先进先出(FirstIn,FirstOut,FIFO)的方式来处理的集合。先放入队列中的元素会先读取。对列的例子有在机场排的队列、人力资源部中等待处理求职信的队列和打印队列中等待处理的打印任务,以及按循环方式等待CPU处理的线程。另外,还常常有元素根据其优先级来处理的队列。注:也可使用链表的另一种实现方式来定义优先级列表。队列使用System.Collections.Ge...原创 2019-12-06 01:10:10 · 122 阅读 · 0 评论 -
只读集合
创建集合后,它们就是可读写的,否则就不能给他们填充值了。但是,在填充完集合后,可以创建只读集合。List<T>集合的AsReadOnly()方法返回ReadOnlyCollection<T>类型的对象。ReadOnlyCollection<T>类实现的接口与List<T>集合相同,但所有修改集合的方法和属相都抛出NotSupportedExcep...原创 2019-12-05 23:44:58 · 364 阅读 · 0 评论 -
列表排序
List<T>类可以使用Sort()方法对元素排序。Sort()方法使用快速排序算法,比较所有的元素,直到整个列表排好序为止。Sort()方法使用了几个重载的方法。可以传递给它的参数由泛型委托Comparison<T>和泛型接口IComparer<T>以及一个范围值和泛型接口IComparer<T>。public void List<...原创 2019-12-05 23:38:31 · 1238 阅读 · 0 评论 -
列表
.NET Framework为动态列表提供了泛型类List<T>。这个类实现了IList、ICollection、IEnumerable、IList<T>、ICollection<T>和IEnumerable<T>接口。下面的例子将Racer类中的成员用作要添加到集合中的元素,以表示一级方程式的一位赛车手。这个类有5个属性:Id、FirstNam...原创 2019-12-05 05:07:38 · 132 阅读 · 0 评论 -
集合接口和类型
数组的大小是固定的。如果元素个数是动态的,就应使用集合类。List<T>是与数组相当的集合类。还有其他类型的集合:队列、栈、链表、字典和集。其他集合类提供的访问集合元素的API可能稍有不同,它们在内存中存储元素的内部结构也有区别。大多数集合类都可在System.Collections和System.Collections.Generic名称空间中找到。泛型类集合位于System...原创 2019-12-05 00:46:55 · 245 阅读 · 0 评论 -
比较内容接口
数组和元祖都实现接口IStructuralEquatable和IStructuralComparable。这两个接口不仅可以比较引用,还可以比较内容。这些接口都是显示实现的,所以在使用时需要把数组和元祖强制转换为这个接口。IStructuralEuqatable接口用于比较两个元组或数组是否有相同的内容,IStructuralComparable接口用于给元祖或数组排序。对于说明IStruct...原创 2019-12-04 05:17:16 · 177 阅读 · 0 评论 -
枚举器迭代集合
在foreach语句中使用枚举,可以迭代集合中的元素,且不需要知道集合中的元素个数。foreach语句使用了一个枚举器。注:GetEnumerator()方法用IEnumerable接口定义。foreach语句并不需要在集合类中实现这个接口。有一个名为GetEnumerator()的方法,它返回实现了IEnumerator接口的对象就够了。IEnumerator接口foreach语...原创 2019-12-04 04:13:24 · 246 阅读 · 0 评论 -
数组排序
Array类使用Quicksort算法对数组中的元素进行排序。Sort()方法需要数组中的元素实现IComparable接口。因为简单类型(如System.String和System.Int32)实现IComparable接口,所以可以对包含这些类型的元素排序。在示例程序中,数组name包含string类型的元素,这个数组可以排序:using System;namespace 简单数...原创 2019-12-04 01:13:25 · 120 阅读 · 0 评论 -
锯齿数组
二维数组的大小对应于一个矩形,如对应的元素个数为3X3。而锯齿数组的大小设置比较灵活,在锯齿数组中,每一行都可以有不同的大小。在声明锯齿数组时,要依次放置左右括号。在初始化锯齿数组时,只在第一对方括号中设置该数组包含的行数。定义各行中元素个数的第二个方括号设置为空,因为这类数组的每一行包含不同的元素个数。之后,为每一行指定行中的元素个数:using System;namespace ...原创 2019-12-03 19:56:26 · 1862 阅读 · 0 评论 -
多维数组
一般数组(也称为一维数组)用一个整数来索引。多维数组用两个或多个整数在来索引。例如,有一个简单的二维数组,该数组由3行3列。第一行的值是1、2和3,第3行的值是7、8和9。在C#中声明这个二维数组,需要在方括号中加上一个逗号。数组在初始化时应指定每一维的大小(也称为阶)。接着,就可以使用两个整数作为索引器来访问数组中的元素。using System;namespace 多维数组...原创 2019-12-03 19:35:38 · 164 阅读 · 0 评论 -
正则表达式
正则表达式作为小型技术领域的一部分,在各种程序中都有着难以执行的作用。正则表达式可以看成一种有特定功能的小型编程语言:在大的字符串表达式中定位子字符串。它不是一种新技术,最初是在UNIX环境中开发的,与Perl和JavaScript编程语言一起使用的比较多。System.Text.RegularExpressions名称空间中的许多.Net类都支持正则表达式。.Net Framework的各个部分...原创 2019-12-03 16:24:52 · 292 阅读 · 0 评论 -
字符串格式
格式字符串不限于内置类型,可以为自己的类型创建自定义格式字符串。为此,只需要实现接口IFormattable。首先是一个简单的Person类,它包含FirstName和LastName属性。class Person{ public string FirstName{get;set;} public string LastName{get;set;} public Person(s...原创 2019-12-02 20:50:54 · 2479 阅读 · 0 评论 -
StringBuilder成员
前面介绍了StringBuilder类的一个构造函数,它的参数是一个初始字符串及字符串的容量。StringBuilder类还有几个其他的构造函数。例如,可以只提供一个字符串:var str = new StringBuilder("Hello");//或者用给定的容量创建一个空的StringBuilder类:var str1 = new StringBuilder(20);除了前面介...原创 2019-12-02 06:06:22 · 176 阅读 · 0 评论 -
构建字符串
String类是一个功能非常强大的类,它实现许多很多有用的方法。但是,String类存在一个问题,重复修改给定的字符串,效率会很低,它实际上是一个不可变的类型,这意味着一旦对字符串对象进行了初始化,该字符串对象就不能改变了。表面上修改字符串内容的方法和运算符实际上是创建了一个新字符串,根据需要,可以把旧字符串的内容复制到新字符串中。例如,考虑下面的代码:string greetingText...原创 2019-12-02 05:29:19 · 525 阅读 · 0 评论