2015-12-26 1 views
-5
List<string> K = new List<string>(); 
byte[] tmp = K[i >> 3].SelectMany(s => Encoding.Default.GetBytes(s)).ToArray(); 

Я завязывания конвертировать, но есть ошибка:Преобразовать часть списка <string> в байт []

Лучший перегруженный метод подходит для «System.Text.Encoding.GetString (байт []) 'имеет некоторые недопустимые аргументы

Как правильно это сделать?

+4

Ваш код и ваша ошибка не совпадают. Вы не вызываете 'GetString' вообще в своем примере кода, что заставляет меня думать, что вы на самом деле не отправляете код, который вы используете. –

+0

Кроме того, ваш пример слишком сложный и скрывает настоящую проблему. Ваш вызов 'K [i >> 3]' возвращает строку, поэтому вы можете упростить ее, просто вызвав 'myString.SelectMany (s => ,,,)', что может помочь вам увидеть проблему самостоятельно. –

+0

Вам нужен двумерный массив байтов [,], и у вас есть только одномерный массив. Каждая строка создаст байт [], а объект List <> содержит несколько строк. – jdweng

ответ

0

Я не уверен, что вы ожидаете от звонка до K[i >> 3]. Ваше название говорит «конвертировать часть списка», но то, что он делает, просто возвращает один строку из вашего List<string>.

Далее вы вызываете SelectMany() на эту строку. Так как string - это IEnumerable<char>, вызов SelectMany пытается вызвать Encoding.Default.GetBytes() на каждом char в строке и вернуть полученный byte[], возвращенный от каждого вызова, в объединенный IEnumerable<byte>. Это не удается, потому что Encoding.Default.GetBytes() ожидает строку параметр, а не char.

Основываясь на вашем названии, я ожидаю, что вы ожидали K[i >> 3], чтобы вернуть IEnumerable<string>, содержащий подмножество вашего оригинала List<string>. Если бы это было так, ваш код имел бы смысл - SelectMany передал бы каждую строку в подмножестве GetBytes, которая вернет byte[], который будет объединен с большим IEnumerable<byte>, содержащим байты для всех строк в подмножестве. Но вам нужно исправить свою основную причину, подмножество-выбор, чтобы это сработало.