奇怪的Array.ConvertAll

时间:2009-11-11 03:51:12

标签: c# arrays

[StructLayout(LayoutKind.Sequential)]
    public struct RecognizeResult
    {

        /// float
        public float similarity;

        /// char*
        [MarshalAs(UnmanagedType.LPStr)]
        public StringBuilder fileName;

    }


RecognizeResult[] results = new RecognizeResult[50];


Array.ConvertAll(results, r => r.fileName = new StringBuilder(50) );

但是结果数组的元素没有改变,每个元素的fileName在ConvertAll()之后为null,有什么不对?

2 个答案:

答案 0 :(得分:1)

如果RecognizeResult是一个类,那么它会起作用。

它与返回值无关,可以安全地忽略它。

问题是RecognizeResult结构的副本被传递给转换器函数(偶然返回StringBuilder)。因此,您不会改变您认为正在改变的价值。

要正确执行此操作,您需要使用数组:

for (int i = 0; i < results.Length; i++)
{
  results[i].fileName = new StringBuilder(50);
}

答案 1 :(得分:0)

Array.ConvertAll返回一个新数组,它不会修改现有数组。您没有将方法的返回值分配给任何内容:

var newArray = Array.ConvertAll(results, r => r.fileName = new StringBuilder(50));

请注意,这只是创建一个空StringBuilders的数组......但是这有点超出了问题的范围,因为你还没有说出你想要完成的任务。