2014-08-29 110 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();