Сортировка по словарю и объединение значений в зависимости от ключей

1

У меня есть объект словаря

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 : точное равенство
  • 0
    @MarcGravell спасибо за совет. Починю.
Показать ещё 2 комментария
Теги:
dictionary
bytearray

4 ответа

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();
0

ссылаясь на это: http://www.dotnetperls.com/sort-dictionary. В С# словарь не имеет метода сортировки. Вы должны отдельно приобрести элемент и отсортировать его. Что-то полезное здесь: Как вы сортируете словарь по значению?

Ещё вопросы

Сообщество Overcoder
Наверх
Меню