Получить все подмножества коллекцииC#

Место общения программистов C#
Ответить
Гость
 Получить все подмножества коллекции

Сообщение Гость »


Я пытаюсь создать метод, который будет возвращать все подмножества набора.

Например, если у меня есть коллекция

Код: Выделить всё

10,20,30
I will like to get the following output

Код: Выделить всё

        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}
};
because the collection can also be a collection of strings for instance I want to create a generic method. This is what I have worked out based on this solution.

Код: Выделить всё

    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;
}
Then I could call that method as:

Изображение



Источник: https://stackoverflow.com/questions/103 ... collection
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»