Удалить или обрезать нули 0 только в конце массива с плавающей точкой [] samples - PullRequest
0 голосов
/ 06 декабря 2018

Я новичок в 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}

Спасибо за вашу помощь

Ответы [ 3 ]

0 голосов
/ 06 декабря 2018
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()
0 голосов
/ 06 декабря 2018

Пока я пробовал это, оно работает для того, что я хочу, но я не уверен, что это самое простое:

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

Спасибо за отзыв!

0 голосов
/ 06 декабря 2018

Я бы начал с поиска окончательного ненулевого индекса:

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

, а затем либо скопировал бы это подмножество (0 - i включительно), либо чтобы избежать выделения I 'используйте Span<T>, чтобы ограничить себя этой частью, не создавая новый массив:

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