private void _GenerateIndexBitRelation(ref uint[,] indexBitRelations, ref bool[] isGenerated, int index, int startIndex, int endIndex) { int intCount = (Count >> 5) + 1; // need column fields Object row = Rows[index]; // each row has its own bit high int intOffset = index >> 5; indexBitRelations[index, intOffset] |= (uint)1 << index; // check isAX columns for (int j = startIndex; j < endIndex; j++) { int value = (int)Delegator.GetPublicFieldDelegate(j).GetValue(row); if (value == -1) { continue; // at first -1, no other values have been found (tested) } intOffset = value >> 5; indexBitRelations[index, intOffset] |= (uint)1 << value; if (!isGenerated[value]) { _GenerateIndexBitRelation(ref indexBitRelations, ref isGenerated, value, startIndex, endIndex); isGenerated[value] = true; } // now we need to | the related row and its relations for (int relationIndex = 0; relationIndex < intCount; relationIndex++) { indexBitRelations[index, relationIndex] |= indexBitRelations[value, relationIndex]; } } }