我想用LINQ解決以下問題,我有以下集合:如何從IEnumerable巧妙地創建一個匿名類型<T>?
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);
}
對於非負I,'第(i + 2)%3 == 0'相當於'則i%3 == 1' 。 – phoog 2012-03-21 22:02:34
我不確定LINQ在這裏有多大的幫助。 MoreLINQ包含'Batch()'方法,這是將枚舉分塊爲大小桶的好方法。或者,一個簡單的'for'循環可能會非常簡單明瞭。 – dlev 2012-03-21 22:05:30
'選擇(b => b)'是一個不適用 – 2012-03-21 22:07:38