2014-08-29 84 views
1

字典和串连值I有一个字典对象排序通过根据键

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表示串联后应该有的字节数的数量。但我坚持如何从这里开始...

任何指针,赞赏。

+5

'double'使得**可怕,可怕的**辞典键,顺便说一句,密钥取决于完全相等;和'double'很少有的一件事:确切的相等 – 2014-08-29 07:38:28

+0

@MarcGravell感谢您的提示。将解决。 – Manas 2014-08-29 07:39:38

+0

@MarcGravell,请告诉我们可以在这里使用'SortedDictionary'吗?另外如果你真的需要'double'这样的东西? – Hassan 2014-08-29 07:46:02

回答

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

您可以使用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作为关键字,因为它不会提供确切的值,但是字典需要有确切的密钥,否则你不会找到它们,或者由于重复而导致异常。

0

使用LINQ你可以写这样的:

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