1. 整数转换,整数和字符串,字符串和整数之间的转换怎么实现?
整数转换为字符串
可以使用ToString()
方法。这个方法会返回该整数的字符串表示。
代码实现:
int a = 122;
//第一种方法
Console.WriteLine(""+a+1);
//第二种方法
Console.WriteLine(a.ToString()+2);
结果:
字符串转换为整数:
int.Parse()
方法可以将字符串转换为整数
int.Parse() 代码实现:
string b1 = "123";
Console.WriteLine(int.Parse(b1)+1);
int.Parse() 结果:
int.TryParse()
方法尝试将字符串的数值转换为整数,并返回一个布尔值来表示转换是否成功。如果转换成功,输出参数将包含转换后的整数;如果转换失败,输出参数将保持其原始值(通常是0),并且方法返回false
。
int.TryParse() 代码实现:
string b1 = "123";
int number;
Console.WriteLine("转换成功:"+int.TryParse(b1, out number));
Console.WriteLine(number);
Console.WriteLine(number+1);
string b2 = "abc";
int number1;
Console.WriteLine("转换失败:"+int.TryParse(b2, out number1));
Console.WriteLine(number1);
Console.WriteLine(number1+1);
int.TryParse() 结果:
Convert
提供了一系列的方法用于将一种数据类型的值转换为另一种数据类型
Convert.ToInt32() 代码实现:
string str = "123";
Console.WriteLine(Convert.ToInt32(str)+1);
Convert.ToInt32() 结果:
2. 日期转换,获取当前日期,字符串转日期,日期转字符串怎么实现?
获取当前日期:
使用DateTime.Now
属性来获取当前的日期和时间(包括时、分、秒和毫秒)。
使用DateTime.Today
属性来获取当前的日期。
代码实现:
//输出当前时间和日期
DateTime time = DateTime.Now;
Console.WriteLine("当前的日期和时间为:"+time.ToString());
//输出当前日期
DateTime today = DateTime.Today;
Console.WriteLine("当前的日期为:"+today.ToString());
结果:
字符串转日期:
将字符串转换为DateTime
对象,可以使用DateTime.Parse
或DateTime.TryParse
方法。Parse
方法如果转换失败会抛出异常,而TryParse
则不会,它会返回一个布尔值来表示转换是否成功。
DateTime.Parse
代码实现:
string dateString = "2024-07-04";
// 输出转换后的日期
Console.WriteLine(DateTime.Parse(dateString).ToString());
DateTime.Parse
结果:
DateTime.TryParse
代码实现:
string dateString = "2024-07-04";
DateTime date;
Console.WriteLine("转换成功:" + DateTime.TryParse(dateString, out date));
Console.WriteLine(date);
DateTime.TryParse
结果:
日期转字符串:
将DateTime
对象转换为字符串,可以使用ToString
方法,并可以指定一个格式字符串来控制输出的格式。
代码实现:
DateTime date = DateTime.Now;
string dateString = date.ToString("yyyy-MM-dd HH:mm:ss"); // 自定义格式
Console.WriteLine(dateString);
Console.WriteLine(dateString+1);
// 只要日期部分
string dateString2 = date.ToString("yyyy-MM-dd");
Console.WriteLine(dateString2);
Console.WriteLine(dateString2+1);
结果:
3. 举例一维、二维、三维数组
一维数组示例:
一维数组是最简单的数组形式,它只有一个维度。
代码体现:
int[] oneArray = new int[5]; // 声明并初始化一个可以存储5个整数的数组
//int[] oneArray = new int[5] {4,5,6,7,8};
//int[] oneArray = {4,5,6,7,8};
// 赋值
oneArray[0] = 1;
oneArray[1] = 2;
oneArray[2] = 3;
oneArray[3] = 4;
oneArray[4] = 5;
// 遍历数组
for (int i = 0; i < oneArray.Length; i++)
{
Console.WriteLine(oneArray[i]);
}
结果:
二维数组示例:
二维数组可以看作是一个表格,其中每个元素都是一个一维数组。它常用于存储矩阵数据。
代码体现:
int[,] twoArray =
{
{ 1,2 },
{ 3,4 },
{ 5,6 }
}; // 声明并赋值一个3行2列的二维数组
// 遍历数组
for (int i = 0; i < twoArray.GetLength(0); i++) // GetLength(0) 返回行数
{
for (int j = 0; j < twoArray.GetLength(1); j++) // GetLength(1) 返回列数
{
Console.Write(twoArray[i, j] + " ");
}
Console.WriteLine(); // 换行
}
结果:
三维数组示例:
三维数组可以看作是一个三维空间中的数据集合。
代码体现:
int[,,] threeArray =
{
{
{ 1,2 },
{ 3,4 }
},
{
{ 5,6},
{ 7,8 }
}
}; // 声明并赋值一个2x2x2的三维数组
// 遍历数组
for (int i = 0; i < threeArray.GetLength(0); i++) // 第一维
{
for (int j = 0; j < threeArray.GetLength(1); j++) // 第二维
{
for (int k = 0; k < threeArray.GetLength(2); k++) // 第三维
{
Console.Write(threeArray[i, j, k] + " ");
}
Console.WriteLine("!!!"); // 第二维结束,换行
}
Console.WriteLine("---"); // 第一维结束,打印分隔符
}
结果:
4. 需求:有个88笔费用记录,总额3亿,金额在300万~800万之间,随机数如何实现?并记录总耗时。
代码实现:
//表示要生成的费用记录的总数
int Totalexpenserecord = 88;
//变量表示目标总金额
double Targettotalamount = 300000000;
//用于存储生成的每笔费用记录
List<double> fees = new List<double>();
//Stopwatch类用于测量代码执行的时间
Stopwatch stopwatch = Stopwatch.StartNew();
//创建了一个Random实例random
Random random = new Random();
for (int i = 0; i < Totalexpenserecord; i++)
{
double fee = random.Next(3000000, 8000000);
fees.Add(fee);
}
double Totalamount = fees.Sum();
double adjustment = Targettotalamount - Totalamount;
if (Math.Abs(adjustment) > 0)
{
fees[fees.Count - 1] += adjustment;
}
//代码停止stopwatch的计时
stopwatch.Stop();
Console.WriteLine($"Total Fees: {fees.Sum():N0}"); // 格式化输出总金额
Console.WriteLine($"Total Records: {fees.Count}");
Console.WriteLine($"Total Time: {stopwatch.ElapsedMilliseconds}ms");
// 输出每笔费用以验证
foreach (var fee in fees)
{
Console.WriteLine(fee.ToString("N0"));
}
结果:
5. 简述常见的集合类型的存储结构和它们的作用以及优缺点,并写出实现案例
(1)数组(Array):
存储结构:连续的内存空间。
作用:用于存储固定大小的数据项集合,每项的数据类型必须相同。
优点:
- 访问速度快,因为元素在内存中是连续的。
- 简单易懂,使用广泛。
缺点:
- 长度固定,一旦创建,大小不能改变。
- 插入和删除操作可能较慢,尤其是在数组开头或中间插入时。
案例:
int[] array = { 1, 2, 3, 4, 5 };
Console.WriteLine(array[2]);
(2)列表(List<T>)
存储结构:动态数组,内部实现基于数组但允许动态调整大小。
作用:用于存储可变数量的数据项集合,每项的数据类型必须相同。
优点:
- 访问速度快。
- 动态调整大小,支持高效的插入和删除操作。
缺点:
- 列表大小在增长时可能涉及内存重新分配和元素复制,影响性能。
案例:
List<int> date = new List<int> { 1, 2, 3, 4, 5 };
date.Add(6);
Console.WriteLine(date[5]);
(3)字典(Dictionary<TKey, TValue>)
存储结构:哈希表,基于键(Key)的快速查找。
作用:存储键值对集合,每个键都是唯一的。
优点:
- 提供了快速的键值查找能力。
- 支持高效的数据检索和更新。
缺点:
- 插入和删除操作可能比列表慢,尤其是在哈希冲突较多时。
案例:
Dictionary<string, int> ages = new Dictionary<string, int>
{
{"Alice", 30},
{"Bob", 25}
};
Console.WriteLine(ages["Alice"]);
(4)集合(HashSet<T>)
存储结构:哈希表,但不存储值对应的键,仅存储唯一值。
作用:用于存储不重复的元素集合。
优点:
- 提供了快速的元素查找能力。
- 保证了元素的唯一性。
缺点:
- 不支持元素的直接索引访问。
- 不保持元素的插入顺序(.NET Core 3.0及以上版本的
HashSet<T>
有OrderBy
等扩展方法可以实现排序)。
案例:
HashSet<int> date = new HashSet<int> { 1, 2, 3, 4, 5 };
date.Add(3);
Console.WriteLine(date.Count);
(5)队列(Queue<T>)
存储结构:FIFO(先进先出)原则存储数据。
作用:用于处理需要按顺序处理的元素集合。
优点:
- 适用于需要按添加顺序处理元素的场景。
缺点:
- 不支持快速随机访问。
案例:
Queue<int> queue = new Queue<int>();
queue.Enqueue(1);
queue.Enqueue(2);
Console.WriteLine(queue.Dequeue());
(6)栈(Stack<T>)
存储结构:LIFO(后进先出)原则存储数据。
作用:用于处理需要后加先处理的元素集合。
优点:
- 适用于需要后加先处理的场景。
缺点:
- 不支持快速随机访问。
案例:
Stack<int> stack = new Stack<int>();
stack.Push(1);
stack.Push(2);
Console.WriteLine(stack.Pop());