예제 #1
0
        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());
        }
예제 #2
0
        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);
        }
예제 #3
0
        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);
        }