优化 List<decimal> all_sum = new List<decimal>(); for (int i = 0; i < 10000; i++) { Random ran = new Random(); var rnum = ran.Next(0, (int)(100 * 100) - 1);//将0~100映射到0~10000,提高精度到小数点后2位;生成随机数rnum; //Console.WriteLine(rnum); all_sum.Add(rnum / 100m);//再换算为0~100范围 }
时间: 2024-02-06 22:03:26 浏览: 48
首先,你的代码中在每次循环中都用 `new Random()` 创建了一个新的 `Random` 实例,这会导致生成的随机数不够随机,建议将 `Random` 实例放到循环外面来。
其次,你可以考虑使用 `Random.NextDouble()` 方法来生成 [0, 1) 范围内的随机小数,然后再乘以 100 来得到 [0, 100) 范围内的随机小数。这样可以避免使用整数除法和类型转换,提高精度和性能。
最终的代码可以改写为:
```
List<decimal> all_sum = new List<decimal>();
Random ran = new Random();
for (int i = 0; i < 10000; i++)
{
var rnum = ran.NextDouble() * 100.0m;
all_sum.Add(rnum);
}
```
相关问题
优化 public List<DepartDto> TreeListCount(int year, int? month, List<DepartDto> AllList, int parentID = 0) { DepartDAL dal = new DepartDAL(); List<DepartDto> List = AllList.FindAll(a => a.ParentID == parentID); foreach (var parentItem in List) { parentItem.total = pareChilTotal(true).FirstOrDefault(a => a.DepartName == parentItem.DepartName)?.total ?? 0; //父级总人数 parentItem.procurementMoney = money(year, month, 2, true).FirstOrDefault(a => a.DepartName == parentItem.DepartName)?.procurementMoney ?? 0; //父级采购金额 parentItem.travelMoney = money(year, month, 3, true).FirstOrDefault(a => a.DepartName == parentItem.DepartName)?.travelMoney ?? 0; //父级出差金额 parentItem.children = TreeListCount(year, month, AllList, parentItem.DepartID); int? childTotal = 0; decimal? procurementMoney = 0; decimal? travelMoney = 0; foreach (var childItem in parentItem.children) { childItem.total = pareChilTotal(false).FirstOrDefault(a => a.DepartName == childItem.DepartName)?.total ?? 0;//子级部门人数 childItem.procurementMoney = money(year, month, 2, false).FirstOrDefault(a => a.DepartName == childItem.DepartName)?.procurementMoney ?? 0; //子级采购金额 childItem.travelMoney = money(year, month, 3, false).FirstOrDefault(a => a.DepartName == childItem.DepartName)?.travelMoney ?? 0; //子级出差金额 childTotal += childItem.total; procurementMoney += childItem.procurementMoney; travelMoney += childItem.travelMoney; } parentItem.total += childTotal; parentItem.procurementMoney += procurementMoney; parentItem.travelMoney += travelMoney; } return List; }
这段代码看起来是一个递归函数,用于构建一个部门树形结构并计算每个部门的总人数、采购金额和出差金额。不过这个函数中有一些可以优化的地方:
1. 在函数中多次调用 `pareChilTotal` 和 `money` 方法,这些方法可能会对数据库进行多次查询,造成性能瓶颈。可以将这些查询结果缓存起来,减少对数据库的访问次数。
2. 在每次循环中对 `AllList` 列表进行查找操作,这也会影响性能。可以将 `AllList` 列表转换为字典或哈希表,以便快速查找。
3. 对于每个部门对象,都会对其子部门进行递归操作,这可能会导致栈溢出。可以加入一些安全机制,比如限制递归深度。
4. 在对子部门进行循环计算时,可以使用 LINQ 语句来简化代码。比如使用 `Sum` 方法来计算子部门的总人数、采购金额和出差金额。
C#如何将求list<Data>存储数据链表中各个数据类型的总和
在C#中,如果你有一个`List<Data>`,其中`Data`是一个包含数值属性的类,并且你想对每个数据项的数值属性求和,你可以这样做:
```csharp
using System;
using System.Collections.Generic;
class Data
{
public object Value { get; set; } // 假设Value字段存储了数值类型的数据
}
// 假设你的Data List
List<Data> dataList = ...;
decimal totalSum = 0;
foreach (Data data in dataList)
{
if (data.Value is int) // 检查Value是否为整数类型
totalSum += (int)data.Value;
else if (data.Value is decimal)
totalSum += (decimal)data.Value;
else if (data.Value is double)
totalSum += (double)data.Value;
// 其他数值类型检查...
else
{
Console.WriteLine($"Unsupported type: {data.Value.GetType()}");
continue; // 或者可以抛出异常
}
}
Console.WriteLine("Total sum: " + totalSum);
```
这段代码遍历`dataList`,并根据`Value`的类型逐个累加。如果遇到非数值类型的值,它会跳过或给出错误提示。为了支持更多的数值类型,你需要添加更多条件判断或其他适当的类型转换。
阅读全文