【问题标题】:What is the most efficient way to merge dictionaries containing a list合并包含列表的字典的最有效方法是什么
【发布时间】:2020-06-23 09:15:29
【问题描述】:

我已经在我的系统中引入了块的概念。每个区块都可以拆分为子区块。
我想到了几种方法来创建或跟踪块中的子块,一种选择可能是这样做(欢迎任何更好的建议):

// // Dictionary <sub-block-number, payload>
Dictionary <UInt16, List<byte>> _payloads { get; set; } = new Dictionary<UInt16, List<byte>>();

现在我向字典中添加内容没有问题,但是将组合的有效负载检索到 byte[] 给我带来了问题。我还看到一堆关于堆栈溢出的事情(请参阅here)使用 Linq,但我不确定这是正确的方法,因为有些人说它非常低效。在所有情况下,这些答案都没有返回 byte[]。
这是我想要实现的:

// Get combined payload from _payloads dictionary
public byte[] GetTotalPayload()
{ .. }

编辑

字典中的Lists会从“sub-block-number”=0到N一一递增。 不确定在组合到 List 时是否指定必须以增量方式对键进行排序很重要?应该不会吧。

【问题讨论】:

  • 尚不清楚 1) 检索 byte[] 的目标是什么(如果要写入文件,直接写入文件会更有效)。 2)如果有一个特定的方式来组合字典中的每个条目。我们可以将任何List&lt;byte&gt; 用于第一项吗?
  • @John,什么文件?从来没有提到过一个文件。只是如何组合字典中的所有列表
  • @John,什么?我没有粗鲁。抱歉,结果是这样的:-)我正在编辑我的问题,因为你正在回答。订购是一个非常好的点,这并不重要,但无论如何可能值得照顾。谢谢。

标签: c# dictionary


【解决方案1】:

使用Enumerable.SelectMany 将值展平为单个数组。

public byte[] GetTotalPayload()
{
    return _payloads.SelectMany(kvp => kvp.Value).ToArray();
}

【讨论】:

  • 就这么简单!谢谢!
【解决方案2】:

您可以使用 SelectMany 将字典值中的每个列表展平为单个列表并转换为数组

var payload = _payloads.SelectMany(kvp => kvp.Value).ToArray();

如果子块编号确实是连续的并且子块本身没有重叠,它将起作用。您也可以在展平值之前按编号OrderBy(kvp =&gt; kvp.Key) 订购商品

【讨论】:

  • 非常感谢,这正是我所需要的 :-) 非常感谢!
猜你喜欢
  • 1970-01-01
  • 2014-04-26
  • 2023-03-17
  • 1970-01-01
  • 2012-08-02
  • 2020-04-09
  • 1970-01-01
  • 2011-01-09
  • 1970-01-01
相关资源
最近更新 更多