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>); }
/// <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); } }