У меня есть объект словаря
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 представляет количество байтов, которые я должен иметь после конкатенации. Но я придерживаюсь того, как исходить отсюда...
Любые указатели оцениваются.
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);
}
Вы можете использовать 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 как ключ в словаре, так как он не отражает точные значения, но словарь должен иметь точные ключи, иначе вы их не найдете или получите исключения из-за дубликатов.
Используя LINQ, вы можете написать это следующим образом:
var Ids = (from key in chunkedStates.Keys
select Convert.ToInt32(Math.Truncate(key))).Distinct().ToList();
ссылаясь на это: http://www.dotnetperls.com/sort-dictionary. В С# словарь не имеет метода сортировки. Вы должны отдельно приобрести элемент и отсортировать его. Что-то полезное здесь: Как вы сортируете словарь по значению?
double
делает ужасный, ужасный словарный ключ, кстати; ключи зависят от точного равенства; и единственное, что вы редко имеете сdouble
: точное равенство