Вопрос:
Я работаю над парсером файлов, и этот бит кода не дает мне то, что я хочу. Прежде чем идти дальше, я должен упомянуть, что я не писал эту программу, я только редактирую источник, чтобы исправить эту конкретную проблему. Кроме того, я могу скомпилировать код, так что это не проблема (вы знаете, как загруженные программы всегда имеют ошибки компиляции). Вот код.
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);
Просто замените , с любым символом, который вы хотите, чтобы разграничить массив.