如何提高此 C# 代码的性能 - 循环数据表并构建字典?

问题描述 投票:0回答:1

我正在循环访问一个集合(DataTable),其中每个项目都有一个“组号”,并构建一个字典,其中每个键对应于组号。数据表中有大约一百万条记录,运行时我遇到了内存问题。我想知道是否可以获得一些有关如何使其表现更好的反馈。我认为也许一个问题是我在每次迭代中创建一个新的

tempList

我非常感谢这里的任何反馈。

Dictionary<int, IEnumerable<Item>> itemGroups = new Dictionary<int, IEnumerable<Item>>();
foreach (DataRow row in dtItems.Rows)
{
    Item item = new Item(row["ID"].ToString(),
        row["Name"].ToString(),
        row["Description"].ToString());

    Int32.TryParse(row["GroupNum"].ToString(), out int groupNum);
    if (!itemGroups.ContainsKey(groupNum))
    {
        List<Item> itemList = new List<Item>();
        itemList.Add(item);
        itemGroups.Add(groupNum, itemList);
    }
    else
    {
        var tempList = itemGroups[groupNum].ToList();
        tempList.Add(item);
        itemGroups[groupNum] = tempList;
    }
}
c# performance dictionary optimization memory-management
1个回答
0
投票

您可以使用 LINQ 来简化它。

GroupBy
扩展方法已经针对聚合项目进行了优化。

Dictionary<int, List<Item>> itemGroups = dtItems.Rows.Cast<DataRow>()
    .GroupBy(row => (int)row["GroupNum"])
    .ToDictionary(g => g.Key,
        g => g.Select(row => new Item(
            row["ID"].ToString(),
            row["Name"].ToString(),
            row["Description"].ToString())
        ).ToList());

正如其他人已经指出的那样,如果可以转换值,则不要转换它们。如果

GroupNum
列包含
int
,则只需将该值转换为
int
。但是,如果列可为空,则它可以包含
DBNull.Value
。我们假设
ID
Name
不是 NULL 列,但
Description
是可选的,因此是 NULL 列。然后你可以像这样优化项目的创建:

g => g.Select(row => new Item(
    (string)row["ID"],
    (string)row["Name"],
    row["Description"].ToString())
© www.soinside.com 2019 - 2024. All rights reserved.