Я пытаюсь создать метод, который будет возвращать все подмножества набора.
Например, если у меня есть коллекция
Код: Выделить всё
10,20,30Код: Выделить всё
return new List()
{
new List(){10},
new List(){20},
new List(){30},
new List(){10,20},
new List(){10,30},
new List(){20,30},
//new List(){20,10}, that substet already exists
// new List(){30,20}, that subset already exists
new List(){10,20,30}
};
Код: Выделить всё
static void Main(string[] args)
{
Foo(new int[] { 10, 20, 30});
}
static List Foo(T[] set)
{
// Init list
List subsets = new List();
// Loop over individual elements
for (int i = 1; i < set.Length; i++)
{
subsets.Add(new List(){set[i - 1]});
List newSubsets = new List();
// Loop over existing subsets
for (int j = 0; j < subsets.Count; j++)
{
var tempList = new List();
tempList.Add(subsets[j][0]);
tempList.Add(subsets[i][0]);
var newSubset = tempList;
newSubsets.Add(newSubset);
}
subsets.AddRange(newSubsets);
}
// Add in the last element
//subsets.Add(set[set.Length - 1]);
//subsets.Sort();
//Console.WriteLine(string.Join(Environment.NewLine, subsets));
return null;
}
Edit
Sorry that is wrong I still get duplicates...
Код: Выделить всё
static List GetSubsets(IEnumerable Set)
{
var set = Set.ToList();
// Init list
List subsets = new List();
subsets.Add(new List()); // add the empty set
// Loop over individual elements
for (int i = 1; i < set.Count; i++)
{
subsets.Add(new List(){set[i - 1]});
List newSubsets = new List();
// Loop over existing subsets
for (int j = 0; j < subsets.Count; j++)
{
var newSubset = new List();
foreach(var temp in subsets[j])
newSubset.Add(temp);
newSubset.Add(set[i]);
newSubsets.Add(newSubset);
}
subsets.AddRange(newSubsets);
}
// Add in the last element
subsets.Add(new List(){set[set.Count - 1]});
//subsets.Sort();
return subsets;
}

Источник: https://stackoverflow.com/questions/103 ... collection
Мобильная версия