Exemplo n.º 1
0
        internal static Array GetSlice(Array data, int size, Slice slice)
        {
            if (data.Rank != 1)
            {
                throw PythonOps.NotImplementedError("slice on multi-dimensional array");
            }

            int start, stop, step;

            slice.indices(size, out start, out stop, out step);

            if ((step > 0 && start >= stop) || (step < 0 && start <= stop))
            {
                if (data.GetType().GetElementType() == typeof(object))
                {
                    return(ArrayUtils.EmptyObjects);
                }

                return(Array.CreateInstance(data.GetType().GetElementType(), 0));
            }

            if (step == 1)
            {
                int   n   = stop - start;
                Array ret = Array.CreateInstance(data.GetType().GetElementType(), n);
                Array.Copy(data, start + data.GetLowerBound(0), ret, 0, n);
                return(ret);
            }
            else
            {
                int   n   = PythonOps.GetSliceCount(start, stop, step);
                Array ret = Array.CreateInstance(data.GetType().GetElementType(), n);
                int   ri  = 0;
                for (int i = 0, index = start; i < n; i++, index += step)
                {
                    ret.SetValue(data.GetValue(index + data.GetLowerBound(0)), ri++);
                }
                return(ret);
            }
        }
Exemplo n.º 2
0
        internal static object[] GetSlice(object[] data, int start, int stop, int step)
        {
            Debug.Assert(step != 0);

            if (step == 1)
            {
                return(GetSlice(data, start, stop));
            }

            int size = PythonOps.GetSliceCount(start, stop, step);

            if (size <= 0)
            {
                return(ArrayUtils.EmptyObjects);
            }

            object[] res = new object[size];
            for (int i = 0, index = start; i < res.Length; i++, index += step)
            {
                res[i] = data[index];
            }
            return(res);
        }