Как получить значение объекта System.String вместо возврата «System.String []»

Вопрос: Я работаю над парсером файлов, и этот бит кода не дает мне то, что я хочу. Прежде чем идти дальше, я должен упомянуть, что я не писал эту программу, я только редактирую источник, чтобы исправить эту конкретную проблему. Кроме того, я могу скомпилировать код, так что это не проблема (вы знаете, как загруженные программы

Вопрос:

Я работаю над парсером файлов, и этот бит кода не дает мне то, что я хочу. Прежде чем идти дальше, я должен упомянуть, что я не писал эту программу, я только редактирую источник, чтобы исправить эту конкретную проблему. Кроме того, я могу скомпилировать код, так что это не проблема (вы знаете, как загруженные программы всегда имеют ошибки компиляции). Вот код.

case EsfValueType.Binary4E: //System.String[] { int size = (int)(this.reader.ReadUInt32() — ((uint)this.reader.BaseStream.Position)); var strings = new string[size / 4]; for (int i = 0; i < size / 4; i++) strings[i] = this.stringValuesUTF16[this.reader.ReadUInt32()]; esfValue.Value = strings.ToString(); break; }

Теперь я добавил .ToString(); часть к вышеуказанной строке, но это не имело никакого значения. Проблема в том, что esfValue.Value заканчивается с System.String[] качестве значения, и я хочу значение объекта System.String. Если вы можете понять это и сказать мне, что не так, это было бы оценено.

Имя программы – ESF Editor 1.4.8.0.

Лучший ответ:case EsfValueType.Binary4E: //System.String[] { int size = (int)(this.reader.ReadUInt32() — ((uint)this.reader.BaseStream.Position)); var strings = new StringBuilder(); for (int i = 0; i < size / 4; i++) { strings.Append(this.stringValuesUTF16[this.reader.ReadUInt32()]); //or AppendLine, depending on what you need } esfValue.Value = strings.ToString(); break; } Ответ №1

Ваша проблема в том, что strings – это не одна строка, а массив строк. В результате ваш вызов ToString вызывает Object.ToString(), который возвращает тип объекта.

Может быть, вы хотите что-то вроде

esfValue.Value = strings.Aggregate((acc, next) => acc + next)

который просто объединяет все строки вместе.

Ответ №2

Переменная strings представляет собой массив строк: класс Array не переопределяет реализацию по умолчанию ToString() которая возвращает тип объекта.

Вам нужно объединить все строки в массиве – либо циклически, либо конкатенировать, либо использовать LINQ и назначить полученную строку esfValue.Value. Конечно, это предполагает, что вы хотите, чтобы значения находились в одной строке один за другим.

Ответ №3

Попробуй это

esfValue.Value = string.Join(«», strings); Ответ №4

Я думаю, вам просто нужно присоединиться к строковым значениям, содержащимся в массиве строк. Для этого вам нужно вызвать String.Join и передать разделитель строк и массив строк. Он возвращает единую System.String.

Ответ №5

Когда вы выполняете.ToString() в классе, который не переопределяет базовый метод.ToString(), чтобы возвращать пользовательскую строку (в какой string[] нет), вы всегда будете получать тип namespace/class в результате.

Массивы сами по себе не имеют значений. Какую ценность вы пытаетесь получить? Вы пытаетесь объединить массив в единую строку с разделителями символов? Если это так, это будет работать:

esfValue.Value = string.Join(«,», strings);

Просто замените , с любым символом, который вы хотите, чтобы разграничить массив.

Оцените статью
Добавить комментарий