2016-01-06 1 views
-1

Я инициализируется массив размера 20 со значением по умолчанию 0xFF следующим образом:Linq выражение для изменения массива значений

Byte[] tempArray = Enumerable.Repeat((Byte)0xFF, 20).ToArray(); 

Теперь я хочу, чтобы изменить значение в каждом 4-м месте в чем-то еще, скажем 0xA0.

Для чего должно быть выражение Linq?

ответ

3

Вы можете использовать Enumerable.Range, а затем спроецировать индекс требуемых значений на основе индекса:

Byte[] tempArray = Enumerable 
    .Range(0, 20) 
    .Select(i => i%4 != 0 ? (Byte) 0xFF : (Byte) 0xA0) 
    .ToArray(); 
+0

лучше '.Range (1, 20)', в противном случае первый байт уже считается Четвертый –

+0

@TimSchmelter: Ну, это зависит от того, в каких местах вы хотите иметь значение '0xA0' и как вы предпочитаете писать выражение' i% 4 =? '. Замена 'Range (0, 20)' на 'Range (1, 20)' приведет к различным результатам. –

+0

@MartinLiversage вы могли бы предложить какое-то место, где я мог бы научиться писать лямбда-выражения и лучше использовать Linq? – ankur

3

LINQ предназначен для доступа к данным, а не для внесения в нее изменений. Если вы начинаете с массива 20 0xFF s, LINQ не является подходящим API для внесения в него изменений.

Однако, вы можете использовать LINQ для создания нового массива на основе старого:

var res = tempArray.Select((v, i) => i % 4 != 0 ? v : (Byte)0xA0).ToArray(); 

Это создает совершенно новый массив, а не менять tempArray на месте. Вы можете сделать копию res в tempArray или сделать задание, если хотите, tempArray изменить.

+0

Я предполагаю, что OP не хочет использовать или изменять старый массив, но просто спрашивает, какой запрос он мог бы использовать для получения массива с переменными значениями. –

+0

@TimSchmelter Сначала я собирался предложить одно и то же, но использование OP «alter», как в заголовке, так и в теле вопроса, предполагает, что он может захотеть внести изменения в исходный массив. Конечно, трудно быть на 100% уверенным. – dasblinkenlight

+0

@TimSchmelter Меня больше интересовало, как написать такой запрос. Можно ли обрабатывать исходную проблему или нет. Спасибо за помощь. Кроме того, вы могли бы предложить какое-то место, где я мог бы научиться писать лямбда-выражения и лучше использовать Linq? – ankur

1
tempArray = tempArray.Select((b, i) => i % 4 == 0 ? (byte)0xA0 : b).ToArray(); 
1

Если вы действительно хотите создать новый массив с переменными значениями, у вас уже есть хорошие рабочие ответы.

Но никто не показал нормальный способ изменить существующий массив, который должен использовать для цикла:

for (int i = 0; i < tempArray.Length; i++) 
    if ((i + 1) % 4 == 0) 
     tempArray[i] = 0xA0; 
Смежные вопросы