Пример #1
0
        private void DropNAs <TDst>(ref VBuffer <TDst> src, ref VBuffer <TDst> dst, InPredicate <TDst> isNA)
        {
            Host.AssertValue(isNA);

            var srcValues = src.GetValues();
            int newCount  = 0;

            for (int i = 0; i < srcValues.Length; i++)
            {
                if (!isNA(in srcValues[i]))
                {
                    newCount++;
                }
            }
            Host.Assert(newCount <= srcValues.Length);

            if (newCount == 0)
            {
                VBufferUtils.Resize(ref dst, src.Length - srcValues.Length, 0);
                return;
            }

            if (newCount == srcValues.Length)
            {
                Utils.Swap(ref src, ref dst);
                return;
            }

            int iDst = 0;

            if (src.IsDense)
            {
                var editor = VBufferEditor.Create(ref dst, newCount);
                for (int i = 0; i < srcValues.Length; i++)
                {
                    if (!isNA(in srcValues[i]))
                    {
                        editor.Values[iDst] = srcValues[i];
                        iDst++;
                    }
                }
                Host.Assert(iDst == newCount);
                dst = editor.Commit();
            }
            else
            {
                var newLength = src.Length - srcValues.Length - newCount;
                var editor    = VBufferEditor.Create(ref dst, newLength, newCount);

                var srcIndices = src.GetIndices();
                int offset     = 0;
                for (int i = 0; i < srcValues.Length; i++)
                {
                    if (!isNA(in srcValues[i]))
                    {
                        editor.Values[iDst]  = srcValues[i];
                        editor.Indices[iDst] = srcIndices[i] - offset;
                        iDst++;
                    }