代码之家  ›  专栏  ›  技术社区  ›  Benny

奇怪的array.convertall

  •  0
  • Benny  · 技术社区  · 15 年前
    [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) );
    

    但是结果数组的元素没有改变,convertall()之后每个元素的文件名都是空的,怎么了?

    2 回复  |  直到 15 年前
        1
  •  1
  •   leppie    15 年前

    如果 RecognizeResult 是一门课,那就行了。

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

    问题是 识别结果 结构传递给converter函数(该函数返回 StringBuilder 顺便说一下)。因此,你不会改变你认为你正在改变的价值。

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

    for (int i = 0; i < results.Length; i++)
    {
      results[i].fileName = new StringBuilder(50);
    }
    
        2
  •  0
  •   Rex M    15 年前

    array.convertall返回新数组,但不修改现有数组。您没有将方法的返回分配给任何内容:

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

    注意,这只是创建一个空的StringBuilder数组…但这有点超出了问题的范围,因为你还没有说你想完成什么。