【问题标题】:Sort through a dictionary and concatenate values depending on keys根据键对字典进行排序并连接值
【发布时间】:2014-10-23 04:33:39
【问题描述】:

我有一个字典对象

Dictionary<double, byte[]>

具有 1.0、1.1、1.2、2.0、2.1、2.2、2.3、2.4、3.0、4.0、...等键

我需要连接值 (byte[]),使得键为 1.0、1.1、1.2 的值是一个字节[],键为 2.0、2.1、2.2、2.3、2.4 的值是一个字节[],依此类推第四次。

我能够获得最终需要的字节数组数量,但必须有一种比我尝试这样做更有效的方法。

var keys = chunkedStates.Keys;
List<int> Ids = new List<int>();
foreach(var key in keys)
            {
                var Id = Convert.ToInt32(Math.Truncate(key));
                if (!Ids.Contains(Id))
                {
                    Ids.Add(Id);
                }
            }

所以 Ids.Count 表示连接后我应该拥有的字节数组的数量。但我不知道如何从这里开始......

感谢任何指针。

【问题讨论】:

  • double 是一个 可怕的 字典键,顺便说一句;键取决于完全相等;和double 很少有的一件事:完全相等
  • @MarcGravell 感谢您的提示。会修复的。
  • @MarcGravell,请告诉我们可以在这里使用SortedDictionary吗?另外,如果您确实需要double 的类似功能怎么办?
  • @HassanNisar SortedDictionary 将处理 ordering 问题(尽管成本不同);它不会处理剩下的事情

标签: c# .net dictionary bytearray


【解决方案1】:
    Dictionary<int, byte[]> results = new Dictionary<int, byte[]>();
    foreach(var grp in data.OrderBy(pair => pair.Key)
               .GroupBy(pair => (int)pair.Key, pair => pair.Value))
    {
        byte[] result;
        if (grp.Count() == 1)
        {
            result = grp.Single();
        }
        else {
            result = new byte[grp.Sum(arr => arr.Length)];
            int offset = 0;
            foreach(byte[] arr in grp)
            {
                Buffer.BlockCopy(arr, 0, result, offset, arr.Length);
                offset += arr.Length;
            }
        }
        results.Add(grp.Key, result);
    }

【讨论】:

    【解决方案2】:

    你可以使用ToLookup:

    ILookup<int, double> lookup = keys.ToLookup(d => (int)d);
    

    如果你想要一个List&lt;int[]&gt;,其中每个条目都包含该整数的所有双精度:

    List<double[]> bytes = lookup
                .Select(g => g.OrderBy(d => d).ToArray())
                .ToList();
    

    但请注意,您不应该在字典中使用 double 作为键,因为它不代表精确的值,但字典需要具有精确的键,否则您找不到它们或由于重复而出现异常。

    【讨论】:

      【解决方案3】:

      参考这个: http://www.dotnetperls.com/sort-dictionary。 在 C# 中,Dictionary 没有排序方法。您必须单独获取元素并对其进行排序。 这里有一些有用的东西: How do you sort a dictionary by value?

      【讨论】:

        【解决方案4】:

        使用 LINQ 你可以这样写:

        var Ids = (from key in chunkedStates.Keys
                   select Convert.ToInt32(Math.Truncate(key))).Distinct().ToList();
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-12-11
          • 1970-01-01
          • 1970-01-01
          • 2011-02-11
          • 1970-01-01
          • 2015-11-23
          • 1970-01-01
          相关资源
          最近更新 更多