2011-08-23 48 views
0

我正在处理一个文件解析器,并且这段代码没有给我我想要的东西。在我走得更远之前,我应该提到我没有写这个程序,我只是编辑源代码来解决这个特定的问题。另外,我可以编译代码,所以这不是问题(你知道下载的程序总是有编译错误)。这是代码。现在如何获取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。

+2

你说“System.String对象的值” - 哪一个?它们有'size/4'。从根本上说,你正在阅读几个字符串 - 我们不知道你是否想要一个包含所有数据的字符串(以某种方式分开?只是混合在一起?)或者只是其中一个值... –

+0

您可能想要考虑重写使用'StringBuilder' –

+0

@Rowland:在我们知道最终结果是什么之前,我看不到'StringBuilder'如何提供帮助。 –

回答

4
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; 
} 
+0

这给了我一个空白的领域。我将最后一行更改为...''test“+ size.ToString()+ strings.ToString();'它给了我”test0“。 –

+0

好吧,看起来像完美的作品。我得到上述的原因是因为我在一个空白的领域。谢谢 –

0

strings变量是一个字符串数组 - Array类不覆盖默认的ToString()实现,该实现返回对象的类型。

您需要连接数组中的所有字符串 - 循环和连接或使用LINQ,并将结果字符串分配到esfValue.Value。当然,这假定你想要所有的值都在一个字符串中,一个接一个地。

1

你的问题是,strings不是一个字符串,它是一个字符串数组。因此,您拨打ToString的电话是Object.ToString(),它返回对象的类型。

也许你想要的东西,像

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

这将简单地串接所有串在一起。

+0

这会做这项工作,但使用'StringBuilder'是一种更有效的方法。 –

+0

正确,已为您的答案+1。可能值得解释为什么他的方法不起作用。 –

+0

哪个类是聚合的? –

0

试试这个

esfValue.Value = string.Join("", strings); 
0

我想你只需要加入包含字符串数组中的字符串值。为此,您需要调用String.Join并传递字符串分隔符和字符串数组。它返回一个单一的System.String。

0

当您对不覆盖返回自定义字符串(其中string[]没有)的.ToString()基方法的类执行.ToString()时,您总是会获取该类型的名称空间/ class作为结果。

数组本身并没有价值。你想要获得什么价值?你是否试图将数组加入单个字符分隔的字符串?如果是这样,这会工作:

esfValue.Value = string.Join(",", strings); 

只需更换,与要界定与阵列的任何性质。

相关问题