private IEnumerable <Tuple <Cube, Cube> > GetPairs(Rubik rubik) { foreach (Cube edge in rubik.Cubes.Where(c => c.IsEdge && Rubik.GetTargetFlags(c).HasFlag(CubeFlag.MiddleLayer))) { Cube corner = rubik.Cubes.First(c => c.IsCorner && (rubik.GetTargetFlags(c) & ~CubeFlag.BottomLayer) == (rubik.GetTargetFlags(edge) & ~CubeFlag.MiddleLayer)); if (!rubik.IsCorrect(corner) || !rubik.IsCorrect(edge)) { yield return(new Tuple <Cube, Cube>(edge, corner)); } } }