按字典排序并根据键连接值

时间:2014-08-29 07:32:46

标签: c# .net dictionary bytearray

我有一个字典对象

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的值是一个字节[],所以类推。

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

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表示串联后我应该有的bytearrays数。但我不知道如何从这里开始......

任何指针都表示赞赏。

4 个答案:

答案 0 :(得分: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);
    }

答案 1 :(得分:1)

您可以使用ToLookup

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

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

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

但请注意,您不应在字典中使用double作为键,因为它不会复制确切的值,但字典需要具有精确的键,否则您无法找到它们,或者由于重复而导致异常。< / p>

答案 2 :(得分:0)

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

答案 3 :(得分:0)

使用LINQ你可以这样写:

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