将项目的密钥存储在并发字典中,该项目的密钥作为在C#中的字典中出现的次数

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了将项目的密钥存储在并发字典中,该项目的密钥作为在C#中的字典中出现的次数相关的知识,希望对你有一定的参考价值。

我正在寻找一个程序来提取大量.csv文件,阅读它们并找到频率最高的产品。我想做的是使用Parallel.ForEach循环读取文件以读取文件并将产品存储到ConcurrentDictionary中(因为其线程安全)。我想知道的是找到一种方法来计算读取特定产品的次数,并将该频率存储为关键,并将值存储为产品本身的名称。有什么帮助吗?

这是我的代码:


string[] files = File.ReadAllLines(@"C:\Users\Samuel Hendrix\Desktop\StoreData\StoreData\" + selectedStore + @"_" + selectedWeek + "_" + selectedYear + @".csv");

                decimal cost;

                //Splitting the content of the files into arrays, which are then stored into variable to be added to lists
                Parallel.ForEach (files, file =>
                
                    string[] orderSplit = file.Split(',');

                    string items = orderSplit[0];

                    Products.TryAdd(items, items.Count() );


                );

答案

每次找到文本时,您都必须在字典中找到它所具有的键(这不是为字典设计的键),然后将其移至下一个键。除了按值搜索之外,还有两个额外的问题:

  • 将项目从一个键移动到另一个键不是原子的。如果在同一时间并行两次发现相同的文本,则两者都将尝试将其从相同的键移至下一个键。至少会有一个失败。

  • 每个键只能有一个值。您尚不知道总数,因此,您可以将一个更频繁的值替换为一个不那么频繁的值。例如,假设“ A”出现10次,“ B”出现20次。但是,到目前为止,它们都只被发现一次...键1只能指向“ A”或“ B”,其他计数丢失。

因此,您需要一个具有字符串键和int值的字典。值是频率...填充后,您可以将数据移至以频率为键的字典。

以上是关于将项目的密钥存储在并发字典中,该项目的密钥作为在C#中的字典中出现的次数的主要内容,如果未能解决你的问题,请参考以下文章

访问嵌套字典,它是密钥Python的值

用于公共存储库的 CircleCI 2.0 私有环境密钥

如何将项目添加到字典“并行循环安全”

在字典中添加密钥之前,如何使用循环?

如何获取 Azure 存储帐户密钥

在PHP文件中编码密钥和密码