C# 编程笔记(本人出品,必属精品)

  • Post author:
  • Post category:其他


更新时间:2020/6/25

首先恭喜你发现宝藏!!!:)

在这里插入图片描述


小姐姐来源于网络😍😍



便宜传送门:

1.

格式化输出


2.

字符串操作


3.

窗体控件


4.窗体编程 –

如何在一个窗体中使用另一个窗体中的控件


5.窗体编程 –

窗体设计多页面教程

之前我想要搞多页面用了一个很笨的

方法

:)



PART I 基础知识



1、数据类型之间的相互转换

序号 方法 描述
1 ToBoolean 如果可能的话,把类型转换为布尔型。
2 ToByte 把类型转换为字节类型。
3 ToChar 如果可能的话,把类型转换为单个 Unicode 字符类型。
4 ToDateTime 把类型(整数或字符串类型)转换为 日期-时间 结构。
5 ToDecimal 把浮点型或整数类型转换为十进制类型。
6 ToDouble
把类型转换为双精度浮点型。
7 ToInt16 把类型转换为 16 位整数类型。
8 ToInt32 把类型转换为 32 位整数类型。
9 ToInt64 把类型转换为 64 位整数类型。
10 ToSbyte 把类型转换为有符号字节类型。
11 ToSingle 把类型转换为小浮点数类型。
12 ToString
把类型转换为字符串类型。
13 ToType 把类型转换为指定类型。
14 ToUInt16 把类型转换为 16 位无符号整数类型。
15 ToUInt32 把类型转换为 32 位无符号整数类型。
16 ToUInt64 把类型转换为 64 位无符号整数类型。

使用示例:

int i = 75;
string str=i.ToString();

关于C# 数据类型及其 其他转换方法,详见:


https://blog.csdn.net/Gou_Hailong/article/details/106155079



2、格式化输出数据

格式化表示的一般格式:

{ N [ , M ] [ :格式码 ] }

其中:

‘[]’

表示可省


N

: 指定参数序列中的输出序号,比如{0} , {1}, {2}等。


M

: 指定参数输出的最小长度。 如果参数长度小于M,则空格填充;若大于等于M,则按实际长度输出;如果M为负,则左对齐,如果M为正,则右对齐;若未指定M,默认为0,如{1,5}表示将参数的值转换为字符串后按照5位右对齐输出。

格式码:可选的格式化代码字符串如下表:

格式符 含义 示例 输出结果
C/c 将数字按照金额形式输出 Console.WriteLine(“{0:c}”, 5201314); ¥5,201,314.00
D/d 十进制整数,指定位数左补0 Console.WriteLine(“{0:d9}”, 5201314); 005201314
F/f 固定位数小数,默认2位 Console.WriteLine(“{0:f3}”, 5201314); 5201314.000
N/n 千分位,小数点后2位 Console.WriteLine(“{0:n}”, 5201314); 5,201,314.00
P/p 百分比输出,整数千分位,小数点后2位 Console.WriteLine(“{0:p}”, 5201314); 520,131,400.00%
X/x 16进制输出,不够前补0 Console.WriteLine(“{0:X8}”, 5201314); 004F5DA2
# 占位符,整数去掉左边无效0 Console.WriteLine(“{0:#}”, 05201314); 5201314



3、字符串(String) .VS. 字符数组(char[])

3.1 字符串(String)函数

int len=str.Length;//得到字符串的长度
string str1=str.Subsring(i,j);//取从i到j的子串
string str1=str.Remove(i,j);//删去从i到j的子串
string str1=str.Replace("ab","AB");//将str中的“ab”替换成“AB”
string[] sArray = str.Split(new string[] { " ", ",", "?", "->" }, StringSplitOptions.RemoveEmptyEntries);//根据string[]里面的内容分割字符串并去掉空项
int a=str.IndexOf(str1); //返回str1的第一个匹配项的位置
str2=String.Copy(str1); //将str1复制给str2
str.ToUpper();//将字符串中所有字符转换为大写
str.ToLower();//将字符串中所有字符转换为小写
str3=String.Join(str1,str2);//将str1与str2合并
double d= double.Parse(str);//将string转化为double

3.2 字符(char)函数

bool bur=char.IsDigit(myChar);//判断字符是否为数字
bool bur=char.IsLetter(myChar);//判断字符是否为字母
bool bur=char.IsPunctuation('?');//判断字符是否为标点符号

3.3 相互转换

char[] cArray=str.ToCharArray();//string转char
string str=new string(cArray);//char转string



4、数组

4.1 数组的声明与初始化

int[] ca=new int[10]{1,2,3,4,5,6,7,8,9,10};//一维数组,下标从0到9
double[,] dou = new double[3, 3]{{1,2,3},{4,5,6},{7,8,9}};//二维数组
int[][] arrj=new int[3][];//交错数组 arrj[0]代表第一行

4.2 数组的方法与属性

int a=A.Length;  //只读 返回所有维数中元素个数的总数
int a=A.Rank; //只读,返回数组的维数
Array.Sort(A); //对一维数组从小到大排序
Array.Reverse(A); //反转数组
A.GetLowerBound(0); //得到数组指定维度的下限,括号中是数组的维度,0是1维
A.GetUpperBound(0); //得到数组指定维度的上限
Array.Clear(A); //清楚数组中所有元素的值,即把数组中所有元素设置为0、false或null
Array.Copy(A); //把一个数组复制给另一个数组



5、窗体控件简介


https://blog.csdn.net/Gou_Hailong/article/details/106663543



PART II 使用示例



1、String操作

 	    static void Main(string[] args)
        {
            string s1 = "小鸟";
            string s2 = s1 + "飞翔";//“+”可以用来合并string
            Console.WriteLine("{0}", s2);// 小鸟飞翔
            string s3 = s2.Substring(1, 3);//取子string函数
            Console.WriteLine("{0}", s3);// 鸟飞翔
            s3 = s3.Replace("飞翔", "自由");//把“飞翔”换成“自由”
            Console.WriteLine("{0}", s3);// 鸟自由
            s3 = s3.Insert(2, "--");//在第三个字符处插入“--”
            Console.WriteLine("{0}", s3);// 鸟自--由
            bool isEqual = (s1 == s2);//判断s1和s2是否相等
            Console.WriteLine("{0}", isEqual);// False
            bool isContain = s2.Contains("鸟飞翔");//判断s2是否包含“鸟飞翔”
            Console.WriteLine("{0}", isContain );// True
            s1 = string.Format("小鸟飞了{0}公里",9);//把一个格式化字符串赋给s1
            Console.WriteLine("{0}", s1);// 小鸟飞了9公里
            Console.ReadLine();
        }
====================================================================



2、类的创建与使用

	class Student//这是一个学生类
    {
        public string name;//公有属性name
        private int age;//私有属性age
        public void SetAge(int agevalue)//公有方法为age赋值
        {
            if (agevalue < 0)
                Console.WriteLine("年龄不能小于0");
            else age = agevalue;
        }
        public int GetAge()//公有方法查询年龄
        { return age; }
    }
    class Program
    {
        static void Main()
        {
            Student S1=new Student ();
            S1.SetAge(-20);
            Console.WriteLine("{0}", S1.GetAge());
            Console.Read();
        }
    }
 =============================================运行结果============
年龄不能小于0
0



3、索引器

//一个参数的索引器
	class Book
    {//可把book理解成只有两个元素(书名,作者名)的集合
        private string Title;
        private string Author;
        //定义索引器:Index是字符串形参,value是隐式参数
        public string this[string index]
        {
            set//把value实参赋给Author或Title字段
            {
                if (index == "Author")
                    Author = value;
                else if (index == "Title")
                    Title = value;
            }
            get //取出Author或Title字段
            {
                if (index == "Author") return Author;
                if (index == "Title") return Title;
                return "Unknow";
            }
        }
    }
    //索引器的使用:对象名[index]
    class Program
    {
        static void Main()
        {
            Book book = new Book();
            book["Title"] = "家国天下";//调用set方法
            book["Author"] = "杨恒骏";
            Console.WriteLine(book["Title"]+" "+book["Author"]);//调用get方法
            Console.Read();
        }
    }
 =============================================运行结果============
 家国天下 杨恒骏
>>>>>>>>
//两个参数的索引器
 	class Books
    {
        private string[] Title=new string[100];//书名数组
        private string[] Author=new string[100];//作者名数组
        //定义索引器:i和index是它的两个形参,value是隐式参数
        public string this[int i,string index]
        {
            set//把value实参赋给Author或Title字段
            {
                if (index == "Author")
                    Author[i] = value;
                else if (index == "Title")
                    Title[i] = value;
            }
            get //取出Author或Title字段
            {
                if (index == "Author") return Author[i];
                if (index == "Title") return Title[i];
                return "Unknow";
            }
        }
    }
    //索引器的使用:对象名[i,index]
    class Program
    {
        static void Main()
        {
            Books books = new Books();
            books[0,"Title"] = "家国天下"; books[0,"Author"] = "杨恒骏";//设置第一条记录
            books[1, "Title"] = "乐生活"; books[1, "Author"] = "文玲";//设置第二条记录
            for(int i=0;i<2;i++)//访问记录
                Console.WriteLine(books[i,"Title"]+" "+books[i,"Author"]);//调用get方法
            Console.Read();
        }
    }
=============================================运行结果============
家国天下 杨恒骏
乐生活 文玲



4、重载运算符

	class Complex
    {
        double r, i;//实部,虚部
        public Complex(double r0, double i0)//构造函数
        { r = r0; i = i0; }
        //重载加运算符,以满足复数运算
        public static Complex operator +(Complex c1, Complex c2)
        {
            Complex c = new Complex(0, 0);
            c.r = c1.r + c2.r;
            c.i = c1.i + c2.i;
            return c;
        }
    }
    class Program
    {
        static void Main()
        {
            Complex c1 = new Complex(2, 1);
            Complex c2 = new Complex(4, 3);
            Complex c3 = c1 + c2;//在此处前面设断点调试看结果
            Console.Read();
        }
    }



5、打开或新建文件



5.1 读文件

注:打开文件的方法有好几种,这里只介绍了我喜欢的一种方法。

注意,操作文件前要在文件头加上:

using System.IO;
//普通读文件
string FilePath=@"D:\MY WORK\C#\c#.txt";
//string FilePath="D:\\MY WORK\\C#\\c#.txt";
StreamReader sR = new StreamReader(FilePath);
string str = sR.ReadLine();
sR.Close();
//窗体读文件
OpenFileDialog file = new OpenFileDialog();
file.Title = "这是打开文件对话框的名字";
file.Filter = "文本文件(*.txt)|*.txt|DAT 文件(*.dat)|*.dat|所有文件(*.*)|*.*";
//file.DefaultExt = "txt";//缺省默认后缀名
file.ShowDialog();
//TextBox.Text = file.FileName;//保存文件路径至TextBox
StreamReader sR = new StreamReader(file.FileName);
string str = sR.ReadLine();
sR.Close();



5.2 写文件

//普通写文件
string FilePath=@"D:\MY WORK\C#\c#.txt";
//string FilePath="D:\\MY WORK\\C#\\c#.txt";
StreamWriter WR = new StreamWriter(FilePath);
WR.Close();
//窗体写文件
string outputTif = null;
SaveFileDialog saveTifFileDialog = new SaveFileDialog();//打开保存文件对话框
saveTifFileDialog.OverwritePrompt = true;//询问是否覆盖
saveTifFileDialog.Filter = "*.txt|*.txt";
saveTifFileDialog.DefaultExt = "txt";//缺省默认后缀名
if (saveTifFileDialog.ShowDialog() == DialogResult.OK)
{
	outputTif = saveTifFileDialog.FileName;
	if (File.Exists(outputTif))
	{//如果文件存在,删除重建
		File.Delete(outputTif);
	}
	System.IO.Stream fileStream = saveTifFileDialog.OpenFile();//保存
    fileStream.Close();
}
StreamWriter WR = new StreamWriter(outputTif);
WR.Close();



5.3 对文件的操作

 		static void Main()
        { //1 如果文件不存在,则创建它,添加数据"abc"后,关闭文件。 
            if (!File.Exists("d:/data.txt"))
                File.WriteAllText("d:/data.txt", "abc");

            //2 复制文件,在c盘产生了"复制data.txt"文件。         
            File.Copy("d:/data.txt", "d:/复制data.txt");

            //3 移动文件:产生了"复制data2.txt"文件,"复制data.txt"被删除。
            File.Move("d:/复制data.txt", "d:/英文小说/复制2data.txt");

            //4 删除文件。
            File.Delete("d:/data.txt");
            Console.Read();
        }



PART III 常用功能实现



1、辅助函数



1.1 求象限角/正切函数

我们常常要实现求一个点相对于另一个点的方位(象限角),这时就会用到正切函数,但是 C# 中 Math 库中自带的正切函数(

Math.Atan(d)/Math.Atan2(dy,dx)

)并不一定可以满足我们的需求,因为 arctan 函数只能求两个象限的象限角(忘记是1,4还是1,2象限了)所以在求象限角的时候要分情况来讨论:

在这里插入图片描述

如上图所示:我们想要求 P[1/2/3/4] 相对于 P0 的方位,可以看到无论是测绘坐标系还是数学坐标系,象限的顺序虽然变了,但是算法并没有变,都是:

象限 特征 算法
I dx>0; dy>0 a=a
II dx<0; dy>0 a=π-a
III dx<0; dy<0 a=π+a
IV dx>0; dy<0 a=2π-a

其中:

a = Math.Atan2(Math.Abs(dy), Math.Abs(dx));


代码实现:

		/*此函数用于求象限角
         */ 
        public static double arctan(double dx, double dy)
        {
            double angle = 0;
            if(dx==0)
            {
                if(dy>0) angle=Math.PI*0.5;
                else     angle=Math.PI*1.5;
                return angle;
            }
            angle = Math.Atan2(Math.Abs(dy), Math.Abs(dx));
            if (dx < 0)
            {
                if (dy < 0) angle = Math.PI + angle;
                else        angle = Math.PI - angle;
            }
            else if (dy < 0) angle = 2 * Math.PI - angle;
            return angle;
        }



1.2 导线方位角计算

导线方位角计算就记住一个口诀就好了:

在这里插入图片描述

代码实现:

		/* 此函数用于计算导线坐标方位角
         * 输入:frontAn: 前一条导线的方位角; ObserAn: 观测的角; bs: 左边(默认)还是右边
         * 输出:当前边的坐标方位角
         */
        public static Angle GetNext_FV(Angle frontAn, Angle ObserAn, string bs = "l")
        {
            bs = bs.ToLower();
            Angle PI = new Angle(Math.PI);
            if (bs != "r")//其实这里没必要取模,因为在重载加减里面已经考虑到角的取值为[0,2*PI)
                return (frontAn + ObserAn + PI) % new Angle(2 * PI);
            else
                return frontAn + ObserAn + PI;
        }



1.3 生成随机数

		/* 辅助函数-求随机数
         * 可选输入:a 下界, b 上界
         */
        public static double getRandom(double a = 0, double b = 100)
        {
            byte[] bytes = new byte[4];
            System.Security.Cryptography.RNGCryptoServiceProvider r = new System.Security.Cryptography.RNGCryptoServiceProvider();
            r.GetBytes(bytes);
            double g = BitConverter.ToInt32(bytes, 0)/100.0;
            double c = b - a;
            return g % c + a;//得到在[a,b)范围内的随机数
        }

调用实例:

 Console.WriteLine("{0} {1}", getRandom(), getRandom(100,200));

由于后面想做的东西太多,写到一个博客里面会比较长,而且网页加载速度会变慢,所以,后面分开来写。



2、坐标转换 四参数/正形变换/七参数


https://blog.csdn.net/Gou_Hailong/article/details/105362474



https://blog.csdn.net/Gou_Hailong/article/details/106960980



3、曲线线路坐标计算


https://blog.csdn.net/Gou_Hailong/article/details/105362633



4、求取圆心/球心坐标


https://blog.csdn.net/Gou_Hailong/article/details/106686355



5、XYZ、BLH、NEU互转;高斯投影正反算


https://blog.csdn.net/Gou_Hailong/article/details/106938497



https://blog.csdn.net/Gou_Hailong/article/details/106960334



6、闭合/附和 导线近似平差


https://blog.csdn.net/Gou_Hailong/article/details/106970884



PART IV 对象/类

下面介绍几个类(有的是我自己写的,不妥之处,还望不吝赐教)



1、矩阵类


https://blog.csdn.net/Gou_Hailong/article/details/98451032



2、点类


https://blog.csdn.net/Gou_Hailong/article/details/88989274



3、角类和里程类


https://blog.csdn.net/Gou_Hailong/article/details/95803595



PART V 学习资源



1.网站

1.MSDN


https://docs.microsoft.com/zh-cn/dotnet/csharp/

2.也许它叫C语言中文网


http://c.biancheng.net/csharp/



2.书籍

1.C# 入门经典

链接:

https://pan.baidu.com/s/11Bibei5yoPv1jBB4EEddbg


提取码:m28l

2.C# 高级编程

链接:

https://pan.baidu.com/s/1xv1WdH-D-PA4SXsz2K8Ixw


提取码:3tuq

3.C# 图解教程

链接:

https://pan.baidu.com/s/1XKeuH7JWuAH1Ysg-iyggkQ


提取码:99nu



PART VI 一些疑问

1.static void Main(string[] args)//括号里面的东西是什么意思?好像不要没什么影响
2.平差法 2.2 有跳不出循环的问题
3.曲线线路坐标计算 3 好像只能计算qr,qr?=hl;ql?=hr.已解决



参考/引用 文章

[1] fonjames-CSDN博主:https://blog.csdn.net/fonjames/article/details/52839889  
[2] bcbobo21cn-CSDN博主:https://blog.csdn.net/bcbobo21cn/article/details/70336535?utm_source=app 
[3] OnLineStudy-CSDN博主:https://blog.csdn.net/OnLineStudy/article/details/5761388?utm_source=app 
[4] 杜_小妖-CSDN博主: https://blog.csdn.net/duyusean/article/details/73381502?utm_source=app 
[5] 百度经验: https://jingyan.baidu.com/article/f7ff0bfc7176492e26bb1309.html 

在这里插入图片描述



版权声明:本文为Gou_Hailong原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。