仅在float []样本数组的末尾删除或修剪零0

时间:2018-12-06 09:39:27

标签: c# arrays trim

我是C#的新手,我想知道在float数组的末尾是否有删除特定值(0)的函数?

例如:

float[] samples = {0.0, 4.0, 2.5, ..., 2.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0};

通话后,我希望我的样品是:

samples == {0.0, 4.0, 2.5, ..., 2.0}

谢谢您的帮助

3 个答案:

答案 0 :(得分:6)

我将从找到最终的非零索引开始:

int i = samples.Length - 1;
for( ; i >= 0; i--)
    if(samples[i] != 0.0F) break;

然后我要么复制该子集(包括0-i),要么为了避免分配,我将使用Span<T>将自己限制为该部分而不创建新的数组:

var span = new Span<float>(samples, 0, i + 1);

答案 1 :(得分:2)

float[] samples = { 0.0f, 4.0f, 2.5f, 2.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f };

var clean = new List<float>();
for (int i = 0; i <samples.Length; i++)
{
    if (i == 0)
    {
        if (samples[i] == 0.0f) clean.Add(samples[i]);
        continue;
    }
    if (samples[i] != 0.0f) clean.Add(samples[i]);
}

//clean.ToArray() = float[]

这可能是更好的解决方案

float[] samples = { 0.0f, 4.0f, 2.5f, 2.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f };

List<float> clean = samples.ToList();
for(int i=clean.Count-1; i>0; i--)
{
    if (clean[i] == 0.0f) clean.RemoveAt(i);
    else break;
}

//clean.ToArray()

答案 2 :(得分:0)

目前,我已经尝试过了,它可以用于我想要的功能,但我不确定它是最简单的:

                float[] samples = new float[AudioFeedbackList[i].GetComponent<AudioSource>().clip.samples * AudioFeedbackList[i].GetComponent<AudioSource>().clip.channels];

            List<float> sampi = new List<float>();
            sampi.AddRange(samples);
            int j = sampi.Count;

            while (sampi[j - 1] == 0.0f)
            {
                j--;
            }

            List<float> newSampi = new List<float>();
            for (int k = 0; k < j; k++)
            {
                newSampi.Add(sampi[k]);
            }


            samples = newSampi.ToArray();

感谢您的反馈!