Каждая комбинация из двух элементов представляет собой декартово соединение (readWords
с само ):
int[] readWords = ...
var result = readWords
.SelectMany(left => readWords
.Select(right => /*TODO: put left and right combination here*/))
.ToArray();
Для того, чтобысоздайте ulong
из 2
int
s, давайте использовать предоставленные вами битовые манипуляции:
(lelf, right) => unchecked(((ulong)left & 0xFFFFFF) | ((ulong)(right & 0xFFFFFF) << 24)))
Наконец
int[] readWords = ...
var result = readWords
.SelectMany(left => readWords
.Select(right => unchecked(((ulong)left & 0xFFFFFF) |
((ulong)(right & 0xFFFFFF) << 24))))
.ToArray(); // materialization, if required
Давайте посмотрим:
int[] readWords = new int[] { 1, 2, 3 };
var result = readWords
.SelectMany(left => readWords
.Select(right => unchecked(((ulong)left & 0xFFFFFF) |
((ulong)(right & 0xFFFFFF) << 24))))
.ToArray();
string report = string.Join(Environment.NewLine,
result.Select(item => item.ToString("x16")));
Console.WriteLine(report);
Результат:
0000000001000001
0000000002000001
0000000003000001
0000000001000002
0000000002000002
0000000003000002
0000000001000003
0000000002000003
0000000003000003
Редактировать: Та же идея ( Cartesian Join ), если вы хотите объединить, скажем,каждый четный элемент с каждым нечетным один:
int[] readWords = new int[] { 0x00123456, 0x00456789 };
var result = readWords
.Where((value, index) => index % 2 == 0) // even indexes only
.SelectMany(left => readWords
.Where((value, index) => index % 2 != 0) // odd indexes only
.Select(right => unchecked(((ulong)left & 0xFFFFFF) |
((ulong)(right & 0xFFFFFF) << 24))))
.ToArray();
string report = string.Join(Environment.NewLine,
result.Select(item => item.ToString("x16")));
Console.Write(report);
Результат:
0000456789123456
Редактировать2: Однако, Декартово объединение здесь, если вы хотите объединить
item_0 and item_1,
item_2 and item_3,
item_4 and item_5,
...
item_2N and item_2N+1,
...
(см. Комментарии ниже; пожалуйста, обратите внимание, что мы не объединяем каждые предметов) просто Select
:
var result = Enumerable
.Range(0, readWords.Length / 2)
.Select(index => new {
left = readWords[2 * index],
right = readWords[2 * index + 1]
})
.Select(pair => unchecked(((ulong)(pair.left) & 0xFFFFFF) |
((ulong)(pair.right & 0xFFFFFF) << 24)))
.ToArray();