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

12 篇文章 21 订阅

更新时间:2020/6/25
首先恭喜你发现宝藏!!!:)
在这里插入图片描述
小姐姐来源于网络😍😍

便宜传送门:

1.格式化输出
2.字符串操作
3.窗体控件
4.窗体编程 - 如何在一个窗体中使用另一个窗体中的控件
5.窗体编程 - 窗体设计多页面教程 之前我想要搞多页面用了一个很笨的方法 :)

PART I 基础知识

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

序号方法描述
1ToBoolean如果可能的话,把类型转换为布尔型。
2ToByte把类型转换为字节类型。
3ToChar如果可能的话,把类型转换为单个 Unicode 字符类型。
4ToDateTime把类型(整数或字符串类型)转换为 日期-时间 结构。
5ToDecimal把浮点型或整数类型转换为十进制类型。
6ToDouble把类型转换为双精度浮点型。
7ToInt16把类型转换为 16 位整数类型。
8ToInt32把类型转换为 32 位整数类型。
9ToInt64把类型转换为 64 位整数类型。
10ToSbyte把类型转换为有符号字节类型。
11ToSingle把类型转换为小浮点数类型。
12ToString把类型转换为字符串类型。
13ToType把类型转换为指定类型。
14ToUInt16把类型转换为 16 位无符号整数类型。
15ToUInt32把类型转换为 32 位无符号整数类型。
16ToUInt64把类型转换为 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十进制整数,指定位数左补0Console.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/x16进制输出,不够前补0Console.WriteLine("{0:X8}", 5201314);004F5DA2
#占位符,整数去掉左边无效0Console.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 的方位,可以看到无论是测绘坐标系还是数学坐标系,象限的顺序虽然变了,但是算法并没有变,都是:

象限特征算法
Idx>0; dy>0a=a
IIdx<0; dy>0a=π-a
IIIdx<0; dy<0a=π+a
IVdx>0; dy<0a=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 

在这里插入图片描述

  • 12
    点赞
  • 49
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

流浪猪头拯救地球

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值