Esempio n. 1
0
 internal Enumerator(CsrMatrixVector <T> vector, bool isColumn = false)
 {
     m_Vector   = vector;
     m_Index    = vector.m_Start - 1;
     m_Version  = vector.m_Matrix.m_Version;
     m_IsColumn = isColumn;
     m_Current  = default(Element <T>);
 }
Esempio n. 2
0
                /// <summary>Advances the enumerator to the next element of the <see cref="T:System.Collections.Generic.List`1" />.</summary>
                /// <returns>true if the enumerator was successfully advanced to the next element; false if the enumerator has passed the end of the collection.</returns>
                /// <exception cref="T:System.InvalidOperationException">The collection was modified after the enumerator was created. </exception>
                public bool MoveNext()
                {
                    if (m_Version != m_Vector.m_Matrix.m_Version)
                    {
                        throw new InvalidOperationException();
                    }
                    CsrMatrixVector <T> vector = m_Vector;

                    if (m_IsColumn)
                    {
                        m_Index++;
                        for (; m_Index < vector.m_Matrix.m_RowsCount; ++m_Index)
                        {
                            int end = vector.m_Matrix.m_RowsMapping[m_Index + 1];
                            for (int i = vector.m_Matrix.m_RowsMapping[m_Index]; i < end; ++i)
                            {
                                int column = vector.m_Matrix.m_Columns[i];
                                if (column > vector.m_Number)
                                {
                                    break;
                                }
                                if (column == vector.m_Number)
                                {
                                    T value = vector.m_Matrix.m_Values[i];
                                    if (object.Equals(value, default(T)))
                                    {
                                        break;
                                    }
                                    m_Current = new Element <T>(column, value);
                                    return(true);
                                }
                            }
                        }
                        return(false);
                    }
                    else
                    {
                        if (m_Index < m_Vector.m_End)
                        {
                            m_Index++;
                            for (; m_Index < vector.m_End; ++m_Index)
                            {
                                T value = vector.m_Matrix.m_Values[m_Index];
                                if (object.Equals(value, default(T)))
                                {
                                    continue;
                                }
                                int column = vector.m_Matrix.m_Columns[m_Index];
                                m_Current = new Element <T>(column, value);
                                return(true);
                            }
                        }
                        m_Index   = m_Vector.m_End;
                        m_Current = default(Element <T>);
                        return(false);
                    }
                }