Дополнительный метод для прямоугольной антенной решетки заливки в C#

Если Вы управляете процессом проверки, или он имеет предсказуемый вывод, вышеупомянутые решения (хранящий в tempfile, пока не закончено, то mv'ing к месту завершенных загрузок, или игнорирующий файлы с '.downloading' вид имени) могли бы работать. Если все это находится вне Вашего контроля, можно удостовериться, что файл не открыт никаким процессом путем выполнения 'lsof $filename' и проверки, существует ли результат. Очевидно, если ни у кого нет открытого файла, безопасно переместить его.

7
задан Robert Venables 7 December 2009 в 15:23
поделиться

2 ответа

Вы можете изменить параметр фиксированного размера на параметр массива, чтобы вы могли поместить расширение в любой массив. Затем я использовал рекурсию для перебора каждой позиции массива.

public static void Fill<T>(this Array source, T value)
{
    Fill(0, source, new long[source.Rank], value);
}

static void Fill<T>(int dimension, Array array, long[] indexes, T value)
{
    var lowerBound = array.GetLowerBound(dimension);
    var upperBound = array.GetUpperBound(dimension);
    for (int i = lowerBound; i <= upperBound; i++)
    {
        indexes[dimension] = i;
        if (dimension < array.Rank - 1)
        {
            Fill(dimension + 1, array, indexes, value);
        }
        else
        {
            array.SetValue(value, indexes);
        }
    }
}
5
ответ дан 7 December 2019 в 10:03
поделиться

Вот решение, которое не использует рекурсию (и является менее сложным):

   public static void FillFlex<T>(this Array source, T value)
    {

        bool complete = false;
        int[] indices = new int[source.Rank];
        int index = source.GetLowerBound(0);
        int totalElements = 1;

        for (int i = 0; i < source.Rank; i++)
        {
            indices[i] = source.GetLowerBound(i);
            totalElements *= source.GetLength(i);
        }
        indices[indices.Length - 1]--;
        complete = totalElements == 0;

        while (!complete)
        {
            index++;

            int rank = source.Rank;
            indices[rank - 1]++;
            for (int i = rank - 1; i >= 0; i--)
            {
                if (indices[i] > source.GetUpperBound(i))
                {
                    if (i == 0)
                    {
                        complete = true;
                        return;
                    }
                    for (int j = i; j < rank; j++)
                    {
                        indices[j] = source.GetLowerBound(j);
                    }
                    indices[i - 1]++;
                }
            }

            source.SetValue(value, indices);
        }
    }

Это смоделировано на основе System.Array.ArrayEnumerator. Эта реализация должна иметь такой же уровень правильности, что и ArrayEnumerator, и (на основании нескольких выборочных проверок), похоже, работает нормально.

1
ответ дан 7 December 2019 в 10:03
поделиться
Другие вопросы по тегам:

Похожие вопросы: