【问题标题】:Storing Items In A ConcurrentDictionary With The Item's Key As The Number Of Times It Appears In The Dictionary In C#将项目存储在并发字典中,并将项目的键作为它在 C# 中的字典中出现的次数
【发布时间】:2019-11-23 23:32:56
【问题描述】:

我正在使用一个程序来获取大量 .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() );


                });

【问题讨论】:

  • 出现频率相同的两个字符串会怎样?
  • 更改值,以防万一发生
  • 我对几件事感到困惑:您是在读取单个文件,并且想要并行处理行,还是您正在读取多个文件并想要处理并想要并行处理每个文件.您还计算所有列的频率还是仅计算特定列的频率(例如,第一列)。
  • 我正在做的是访问 .csv 文件,读取所有行,将基于 ',' 的行拆分为一个数组,并获取添加到并发的数组 [0] 成员字典,所有我说的并行。但是我的问题我想知道如何计算读取特定项目的次数并将该值存储为项目的键

标签: concurrentdictionary


【解决方案1】:

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

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

  • 每个键只能有一个值。您还不知道总计数,因此,您可以用频率较低的值替换频率较高的值。例如,假设“A”出现 10 次,“B”出现 20 次。但是,到目前为止,它们都只被发现过一次……键 1 只能指向“A”或“B”,其他计数丢失。

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

【讨论】:

  • 那么您要说的是,与其将频率存储为键,不如将其存储为 int 值?
  • @Hendrix 我想​​您希望能够轻松地按频率查询。但是,您将无法同时直接从文件中以频率作为键来填充字典。而是使用字符串和键以及频率作为值填充字典,完成后,将数据从该字典移动到您想要的字典。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-10-12
  • 1970-01-01
  • 1970-01-01
  • 2018-05-22
  • 2022-11-15
  • 1970-01-01
  • 2020-09-02
相关资源
最近更新 更多