BuildEqualityTable(IList <T> left, IList <T> right, IEqualityComparer <T> comparer) { BitArrayND eq = new BitArrayND(left.Count, right.Count); for (int l = 0; l < left.Count; l++) { for (int r = 0; r < right.Count; r++) { eq [l, r] = comparer.Equals(left[l], right[r]); } } return(eq); }
CountDiagonal(BitArrayND eq, int x, int y, int xLen, int yLen) { int count = 0; for ( int i = x, j = y; i < xLen && j < yLen && eq [i, j]; i++, j++) { count++; } return(new Diagonal { X = x, Y = y, Length = count }); }
static void TestBitArrayND() { int [] dimensions = new [] { 2, 3, 4, 5, 6 }; BitArrayND a = new BitArrayND(dimensions); a.Clear(); int expectedIndex = 0; for (int i = 0; i < dimensions [0]; i++) { for (int j = 0; j < dimensions [1]; j++) { for (int k = 0; k < dimensions [2]; k++) { for (int l = 0; l < dimensions [3]; l++) { for (int m = 0; m < dimensions [4]; m++) { int [] index = new [] { i, j, k, l, m }; int index1d = a.GetIndex(index); if (expectedIndex != index1d) { throw new InvalidOperationException("Assertion failed: expected different index: " + index1d + ", actual: " + index1d); } if (a [index]) { throw new InvalidOperationException( index.Aggregate( new StringBuilder("Assertion failed: "), (s, n) => s.Append(n + ", "), s => { s.Length -= 2; return(s.ToString()); })); } a [i, j, k, l, m] = true; expectedIndex++; } } } } } return; }
AnalyzeEqualityTable(BitArrayND eq) { List <Diagonal> list = new List <SimpleSequenceComparer <T> .Diagonal> (); int xLen = eq.GetLength(0); int yLen = eq.GetLength(1); for (int x = 0; x < xLen; x++) { for (int y = 0; y < yLen; y++) { Diagonal diag = CountDiagonal(eq, x, y, xLen, yLen); if (diag.Length > 0) { list.Add(diag); } } } return(list); }