【问题标题】:Remove or trim zeros 0 at the end only of a float[] samples array仅在 float[] 样本数组的末尾删除或修剪零 0
【发布时间】:2018-12-06 09:39:26
【问题描述】:

我是 C# 的新手,我想知道是否有一个函数可以删除浮点数组末尾的特定值 (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}

感谢您的帮助

【问题讨论】:

标签: c# arrays trim


【解决方案1】:

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

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);

【讨论】:

  • int i = samples.Length - 1; while(samples[i] == 0.0f) i--; 是遍历数组的另一种方式。
  • @D.Go nice,我喜欢这样
  • 补充说明:如果您需要存储范围,请使用Memory&lt;float&gt;而不是Span&lt;float&gt;,并在需要时访问.Span;或者如果您使用的是老式 .NET:ArraySegment&lt;float&gt; 也可以,但一切都变成手动的
  • span的巧妙使用,不就是c#7.2的特性吗?
  • @MihirDave 确实;如果您查看您上面的评论,我确实建议了版本受损的替代方案
【解决方案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()

【讨论】:

    【解决方案3】:

    目前,我已经尝试过了,它工作符合我的要求,但我不确定它是否最简单:

                    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();
    

    感谢您的反馈!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多