public string[] GetSubsets <T>(T obj) { var type = typeof(CacheMemberAttribute); var props = typeof(T).GetProperties() .Where(p => Attribute.IsDefined(p, type)) .OrderBy(p => ((CacheMemberAttribute)p.GetCustomAttributes(type, false).Single()).Position) .ToList(); var items = new int[props.Count]; for (int i = 0; i < items.Length; i++) { items[i] = i + 1; } var subsets = SetSolver.Solve(items, fill: true); var keys = new List <string>(); var sb = new StringBuilder(); int[] subset; foreach (var item in subsets) { subset = item.ToArray(); for (int i = 0; i < item.Count(); i++) { if (subset[i] == 0) { sb.Append("#"); } else { sb.Append(GetValue(obj, props[subset[i] - 1])); } } keys.Add(CleanKey(sb.ToString())); sb.Clear(); } return(keys.Distinct().ToArray()); }
public void Solves3Correctly() { var set = new int[] { 1, 2, 3 }; var res = SetSolver.Solve(set) .Select(f => f.ToArray()) .ToArray(); var solved = new int[8][] { new int[] { 1, 2, 3 }, new int[] { 2, 3 }, new int[] { 1, 3 }, new int[] { 3 }, new int[] { 1, 2 }, new int[] { 2 }, new int[] { 1 }, new int[] {} }; Assert.Equal(solved, res); }
public void FillsCorrectly() { var set = new int[] { 1, 2, 3 }; var res = SetSolver.Solve(set, fill: true) .Select(f => f.ToArray()) .ToArray(); var solved = new int[8][] { new int[] { 1, 2, 3 }, new int[] { 0, 2, 3 }, new int[] { 1, 0, 3 }, new int[] { 0, 0, 3 }, new int[] { 1, 2, 0 }, new int[] { 0, 2, 0 }, new int[] { 1, 0, 0 }, new int[] { 0, 0, 0 } }; Assert.Equal(solved, res); }