C# 笔记2 - 数组、集合、文本文件处理


正在做笔记中…

任何软件编程语言都会涉及到这些基本内容——栈、队列、列表、数组、散列表等等,没有它们几乎无法完成任何工作。只是不同语言对某些数据结构由不同的封装,其中我最喜欢的还是python。道理很简单——简单方便,因此我喜欢使用python的数据结构作为对比。

文末将示范一个C#解析日志文件实战案例。

1. 随笔

在多数情况下的编程实战中,我们几乎不喜欢使用数组,主要是麻烦——数组的显著特点是,其只能存储类型一致的数据。在公认的强类型语言(java、C、C++等,当然也有部分人认为C++是弱类型,这里不做讨论。)中,组数是一种直接用于容纳一组同类数据的容器,在这一点上C#也一样,声明后就不能装其它类型:

int [] ary =  new int[3]{99,98,92};

但这不是我们期待的——我们只希望获得一个箱子,这个箱子应该是可以想装什么装什么的,就像哆啦A梦的口袋一样:


(图片来源于网络)

python提供的几大基本数据类型都是这样的口袋型,其中与数组最接近的就是列表(list)元组(tuple)了,都属于复合数据对象,并且自带很多方法,这里推荐一篇博客——Python序列专题,对python中的相关内容由详细地讨论。不得不说,作为一门现代的面向对象编程语言,将其作为可以直接使用的基本数据类型是更科学的。在C#中却需要通过using语句使用其内建的库。如System.Collections类的ArrayList

语言 \ 数据结构 队列 链表 数组 字典(哈希表/散列表) 列表(一种序列) 元组 集合/集
python - collections.deque - array.array dict list tuple set(集合)
C# Stack Queue LinkedList Array Hashtable ArrayList Tupls HashSet(集)

2. C# 数组

2.1 数组的声明和初始化

可以一步完成:

int [] a = new int[5]  { 4,  6, 2, 5, 7};

输出结果

当然也可以分开完成:

int [] a;
a = new int[5]  { 4,  6, 2, 5, 7};

输出结果

2.2 对数组赋值

a[1] = 6;

输出结果

2.3 索引数组

输出结果

2.4 使用增强型for语句foreach遍历数组

输出结果

2.5 多维数组

2.5.1 声明一个多维数组

float [,] a;    // 声明一个float型二维数组a
int [ , , ] b;  // 声明一个int型三维数组b

3. C# 集合

3.1 动态数组ArrayList

【例1】初始化、添加元素

// 省去部分无关主题代码
ArrayList a = new ArrayList();
a.Add(6);
a.Add("AaBbCc")
a.Add(3.14)Base.print(a);   // 在控制台打印列表a

输出结果

[6, "AaBbCc", 3.14]

【例2】获取ArrayList列表长度

class Base...Base.print(a.Count);    // 通过 ArrayList 的 Count 属性获得 实际包含的元素个数

输出结果

3

【例3】对ArrayList进行索引

ArrayList a = new ArrayList();
a.Add(6);
a.Add("AaBbCc");
a.Add(3.14);
for (int i = 0; i < a.Count; i++)
{Base.print(a[i]);
}

输出结果

6
"AaBbCc"
3.14
  • 但是与python中的列表直接用索引值-1来获取最后一个元素不同,ArrayList无法这样获取最后一个元素,需要获取最后一个元素需要按照长度来:
ArrayList a = new ArrayList();
a.Add(6);
a.Add("AaBbCc");
a.Add(3.14);
Base.print(a[a.Count - 1]);

输出结果

3.14

【例4】对ArrayList进行排序
可以使用ArrayList.sort()方法

ArrayList a = new ArrayList();
a.Add(6);
a.Add(7);
a.Add(2);
a.Add(4);
Base.print(a);
a.Sort();
Base.print(a);

输出结果

[6, 7, 2, 4]
[2, 4, 6, 7]

【例4】在ArrayList的指定位置插入元素
可以使用ArrayList.Insert()方法

a.Add(6);
a.Add(7);
a.Add(2);
a.Add(4);
Base.print("插入元素前:");
Base.print(a);
a.Insert(1,"elem");
Base.print("在第1个位序后插入元素后:");
Base.print(a);

输出结果

插入元素前:
[6, 7, 2, 4]
在第1个位序后插入元素后:
[6, "elem", 7, 2, 4]

3.2 栈Stack

栈的特点是,后进先出FILO。C# 提供了Stack对象。

该对象主要提供了以下方法/属性:

属性/方法 功能描述
Stack.Count Stack 中包含的元素个数
Stack.Pop() 出栈(移除并返回在 Stack 的顶部的对象。)
Stack.Push() 进栈(向 Stack 的顶部添加一个对象)
Stack.Peek() 查看(仅返回)栈顶元素。
Stack.Contains() 判断某个元素是否在 Stack 中。
Stack.Clear() 从 Stack 中移除所有的元素。
Stack.ToArray() 复制 Stack 到一个新的数组中

【例1】

3.3 队列Queue

队列的特点是先进先出FIFO,C# 提供了队列对象Queue

该对象主要提供了以下方法/属性:

属性/方法 功能描述
Queue.Count Queue 中包含的元素个数
Queue.Enqueue 入队(向 Queue 的末尾添加一个对象)
Queue.Dequeue() 出队(移除并返回在 Queue 的开头的对象)
Queue.TrimToSize() 置容量为 Queue 中元素的实际个数
Queue.Contains( object obj) 判断某个元素是否在 Queue中。
Queue.Clear() 从 Queue中移除所有的元素。
Queue.ToArray() 复制 Queue 到一个新的数组中

3.4 链表

3.5 字典

4. 实战——日志文件(文本文件)解析案例

4.1 案例概述

现有一个txt日志文件内容如下:

|                                                                                                                                   |                                                                                表格标题1      ||  日期    | 表头1 |     表头2     |          表头3          |      表头4 |    表头5     |    表头6     |  表头7  | 表头8 |    表头9    |     表头10 |时间    ||2009-01-25|  ACD  |       254       | 583   |      777      |    QWF    | 753 |752    |   3    |       3546.99|            6.66| 20:46 ||2009-01-25| ACD |       396       |         463         |      999      |    QWG    | 432 |342    |   7    |       3456.66|            6.66| 20:46 ||   总计   |        | 746 | 1,046 | 1,776 |  | 1,185 | 1,184 |   10   | 7,003.65 |            22.00|        880.16|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------|                                                                                表格标题2
|
|
|| 表头1 |     表头16     |          表头3          |      表头4      |  表头14   | 表头8 |      表头9      |    表头11    |  表头12  |表头13|表头17|时间||  内容1   |       ABC       |        456        |      666      |    453    |   60   |          4,258.00|        777.16|  LJG   |5357       |58      |       20:46||  总计  |                  | 456 | 666 | 453 |   60   | 4,258.00 |        777.16|     |5357|58|20:46|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------|                                                                                表格标题3
||   日期   | 表头1 |          表头3          |      表头4      |  表头7  |  表头13  |    表头15    |    表头17    |   表头18   | 表头19 |  表头12  |时间||2009-01-25     | HGF |        267        |      106      |JFG    |   666    |       888.00|     222.00|       4666.00|        2626.00|  内容7   |      20:46||2009-01-25| ACD   |         475         |      109      |JFG    |   777   |       888.00|       222.00|     6777.00|      2626.00|  内容7   |20:46      ||   总计   |        | 742          | 215 |        |   1443   |            1776.00 | 444.00         |              11443.00 |       5252.00     |       |          |--------------------------------------------------------------------------------------------------------------------------------------------------------------------------|                                                                                表格标题4
||   日期   | 表头1 |          表头3          |      表头4      |   表头25   |   表头22   |    表头9    |    表头20     |     表头21     |  表头20|     表头21     |  时间  ||2009-01-15|  ACD  |         453         |      345      |   33    |   99    |       550.00|    715.00 | 785.00 |          -50.00|              0.01|  16:26  ||2009-01-15| ABC |         345         |      2105      |   44    |   88    |       650.00| 615.00   | 705.00 |          70.00|              0.02| 16:26 ||2009-01-18|  HGF  |         646         | 654   |   55   |   77    |       433.00| 432.00 |         429.00|        66.00|              1.00| 16:26 |
|2009-01-18|     HGF  |         2634         |      35      |   66    |   66    |       393.00|    932.00 |         429.00|         99.00|              0.00| 16:26 ||2009-01-18|      HGF  |         345         |      5      |   77    |   55    |       439.00|       43.00 |         499.00|        66.00|              2.30| 16:26 ||2009-01-18|  HGF       |         5436         | 123   |   88    |   44    |       463.00| 92.00 |         429.00|         -30.00|              1.00| 16:26 ||2009-01-18|  HGF  |         26         |      456      |   99    |   33    |       396.00| 42.00 |         429.00|        50.00|              0.06| 16:26 ||   总计   |        |                        |                |        |        |        |        |        |        |        |  内容6    |--------------------------------------------------------------------------------------------------------------------------------------------------------------------------|                                                                                表格标题5
|
|
|  表头1  |          表头3          |      表头4      |   表头25   |表头26|   表头22   |表头9|    表头9    |     表头21     | 表头20 |     表头21     |     时间     ||   内容1    |         ASF         |      22      |  30   | 965.41 |   0    |    0.00|       7665.40|         9119.00|       12,0.00|              0.00|    12:29    ||   ABC |        DGN        |      33      |   10   |   47.30   |  300   | 444.00|       7669.00|         1805.00|       15,00.00|              0.00|       12:29   |
|   ACD   |         DFG         |      44      |   20   |  780.16  |   0    |    666.00|       6660.00|         1780.00|            -190.00|              0.00|       12:29   ||   ACD   |       DGN       |      55      |   80   |252.15 |   0    |    888.00|       2266.15|         3790.00|      4,80.00|              0.00|     12:29     ||   ABC   |         DFG         |      666      |   25   |  4393  |   0    |    222.00|       6688.00|         299.00|       -8,250.00|              0.00|   12:29 ||   总计   |                        | 820 |  165  |        | 300 | 2220 |         | -6340 |           | 0.00 |         |--------------------------------------------------------------------------------------------------------------------------------------------------------------------------

我们需要将该文件中所有的表解析出来,得到一种便于索引的结构。比如python第三方库pandas中的DataFrame那样,每一个对应一张表。可以回忆下在写python中的作法:

以上是python在jupyter环境中实现的。可以看到,我们只要给定值即可出来整个表。这是接下来通过C#实现与之相同的功能。

4.2 C# 读取文本文件

这是万丈高楼第一层,就是需要在C#中读取这个文本。我们希望的是读取后按行处理。
这需要用到System.IO中的StreamReader对象,详细用法请查询手册。
现给出代码如下:

using System;
using System.IO;
using System.Collections;class Base...    //(已省略)class Parser
{public static void LogReader(string path){/* 读取 */StreamReader sr = new StreamReader(path);string line;while ((line = sr.ReadLine()) != null){Base.print(line);}}
}class Program
{public static void Main(){/* 指定路径 */string file_path= @"C:\Users\李俊才\Documents\WeChat Files\wxid_alacfd07418y22\FileStorage\File\2021-02\puretextlog.txt";/* 解析日志 */Parser.LogReader(file_path);}
}

运行结果(部分截图):

4.3 文件解析的思路

C# 笔记2 - 数组、集合与与文本文件处理相关推荐

  1. java 数组覆盖_JavaSE——数组集合

    原标题:JavaSE--数组集合 声明:本栏目所使用的素材都是凯哥学堂VIP学员所写,学员有权匿名,对文章有最终解释权:凯哥学堂旨在促进VIP学员互相学习的基础上公开笔记. Arrays:介绍:数组的 ...

  2. Java中大数据数组,Java基础学习笔记之数组详解

    摘要:这篇Java开发技术栏目下的"Java基础学习笔记之数组详解",介绍的技术点是"java基础学习笔记.基础学习笔记.Java基础.数组详解.学习笔记.Java&qu ...

  3. LeetCode刷题笔记2——数组2

    LeetCode刷题笔记2--数组2 重塑数组 题目 在 MATLAB 中,有一个非常有用的函数 reshape ,它可以将一个 m x n 矩阵重塑为另一个大小不同(r x c)的新矩阵,但保留其原 ...

  4. 尚硅谷大数据技术Scala教程-笔记04【集合】

    视频地址:尚硅谷大数据技术之Scala入门到精通教程(小白快速上手scala)_哔哩哔哩_bilibili 尚硅谷大数据技术Scala教程-笔记01[Scala课程简介.Scala入门.变量和数据类型 ...

  5. Polyworks脚本开发学习笔记(十二)-输出和读取文本文件

    Polyworks脚本开发学习笔记(十二)-输出和读取文本文件 Polyworks作为一个测量工具,将测量的数据方便的导出到文本文件则是一项必须的功能.在DATA_FILE这个命令下提供了很多子命令用 ...

  6. Kotlin学习笔记--Kotlin之集合

    Kotlin学习笔记--Kotlin之集合 集合类 1. List 集合 1.1 不可变list 1.2 可变list MutableList 1.3 集合遍历 1.4 List的操作函数 1.5 l ...

  7. (1)学习数组,集合,IEnumerable接口,引申学习迭代器

    发展:数组-->集合-->泛型 (1)数组 1. 数组数据结构是System.Array类的一个实例. 2. System.Array类的语法为 [SerializableAttribut ...

  8. Java的数组集合概括

    Java的数组集合概括 Collection 1.List(存储有序,有索引,可以重复) 1.1.ArrayList 底层是数组实现的,线程不安全,查找和修改快,增删比较慢 1.2.LinkedLis ...

  9. JavaScript学习笔记之数组(二)

    JavaScript学习笔记之数组(二) 1.['1','2','3'].map(parseInt) 输出什么,为什么? ['1','2','3'].map(parseInt)//[1,NaN,NaN ...

最新文章

  1. django使用auth模块进行身份认证
  2. oracle 新建路径,Linux环境安装Oracle11g(三)——用户、路径创建及配置环境变量
  3. 神策数据实战学堂开课,分享行业最佳业务和技术实践
  4. Java基础篇:封装、继承、多态三大特性
  5. 计算机网络(1)TCP和UDP
  6. TCP拥塞控制和流量控制
  7. Hive大数据-Hive的优缺点---大数据之Hive工作笔记0002
  8. android colorstatelist_B站Android多主题框架开源:MagicaSakura
  9. 读书笔记——数据库系统概论
  10. PAT乙级1088 三人行 (20分)
  11. jxl freemark
  12. 最大似然参数估计的求解
  13. urlhelper 使用教程
  14. 解锁网易云音乐客户端变灰歌曲的详细教程
  15. 做阿里巴巴国际站比较容易踩雷的地方
  16. 什么是git 暂存区
  17. LoadLibraryEx(DONT_RESOLVE_DLL_REFERENCES)的缺陷
  18. 苹果cms怎么一键删除所有视频
  19. 单身公寓app开发,年轻人的租房首选
  20. 关于字符串旋转问题的一些心得

热门文章

  1. 程序员面试金典——17.9词频统计
  2. 【数据科学】什么是数据科学?
  3. Matlab之通用特殊矩阵函数
  4. leetcode算法题第三题(c++)
  5. TypeError: Layout of the output array image is incompatible with cv::Mat
  6. Tensorflow 中添加正则化项
  7. 简单的webservice发布和测试
  8. 57-Insert Interval
  9. linux卸载HBA卡驱动
  10. 在bitbucket.org上创建Git仓库