Я хотел бы использовать LINQ для решения следующей проблемы, у меня есть следующая коллекция:
List<byte> byteList = new List<byte() { 0x01, 0x00, 0x01, 0x02, 0x01, 0x00, 0x3, 0x4, 0x02 };
Данные в этом примере соответствуют следующей схеме:
byteList [0] = адрес (1, 2, 3, ... n)
byteList [1] = старое состояние, которое в основном является представителем перечисления
byteList [2] = новое состояние, такое же, как указано выше
Я взаимодействую со встроенным устройством, и именно так я могу просматривать изменения во входах.
Чтобы очистить код и сделать так, чтобы программисту, выполняющему техническое обслуживание, было проще следовать моей логике, я бы хотел абстрагироваться от некоторых затягивающихся деталей и извлечь каждый трехбайтовый набор данных в анонимный тип для использоваться в функции для выполнения некоторой дополнительной обработки. Я написал быструю реализацию, но я уверен, что ее можно значительно упростить. Я пытаюсь очистить код, а не мутить воду! Должен быть более простой способ сделать следующее:
List<byte> byteList = new List<byte>()
{
0x01, 0x09, 0x01, 0x02, 0x08, 0x02, 0x03, 0x07, 0x03
};
var addresses = byteList
.Where((b, i) => i % 3 == 0)
.ToList();
var oldValues = byteList
.Where((b, i) => i % 3 == 1)
.ToList();
var newValues = byteList
.Where((b, i) => i % 3 == 2)
.ToList();
var completeObjects = addresses
.Select((address, index) => new
{
Address = address,
OldValue = oldValues[index],
NewValue = newValues[index]
})
.ToList();
foreach (var anonType in completeObjects)
{
Console.WriteLine("Address: {0}\nOld Value: {1}\nNew Value: {2}\n",
anonType.Address, anonType.OldValue, anonType.NewValue);
}