我有一个字典对象
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数。但我不知道如何从这里开始......
任何指针都表示赞赏。
答案 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();