Member 14561224 Ответов: 3

C# - выбор различных комбинаций из списка элементов


Как получить все возможные комбинации элементов из списка в C#? У меня есть список, давайте назовем его elementsList Я хочу найти все возможные комбинации со следующими условиями из списка:

- Никаких повторяющихся целых чисел.
- Целые числа в комбинациях должны располагаться в хронологическом порядке.

Каждая комбинация должна состоять из 5 целых чисел. Так, например, если мой elementsList содержит целые числа 1, 2, 3, 4, 5 и 6 - есть 6 допустимых комбинаций:

- 1, 2, 3, 4, 5
- 1, 2, 3, 4, 6
- 1, 2, 3, 5, 6
- 1, 2, 4, 5, 6
- 1, 3, 4, 5, 6
- 2, 3, 4, 5, 6

Как я могу достичь этого результата в C#? Заранее спасибо.

Что я уже пробовал:

У меня нет проблем с написанием кода, я застрял на логике. Каким будет процесс/шаги для всего вышесказанного? Спасибо.

BillWoodruff

Покажите код, который у вас есть сейчас.

":комбинации должны быть в хронологическом порядке" что это значит ?

Member 14561224

Ладно, извини, что я не использовал правильный термин. Я хотел сказать, что каждое целое число в комбинации должно быть больше, чем предыдущее целое число в комбинации. Например, 1, 3, 2 не является допустимой комбинацией, в то время как 1, 4, 5 является.

BillWoodruff

С этими ограничениями вам будет гораздо проще создать решение. твое здоровье, Билл

George Swan

Взгляните на свой пример. Это матрица из 6 строк и 5 столбцов. Каждое число присутствует в 5 из 6 строк. Посмотрите, как были заполнены столбцы. Первый столбец заполняется первым номером в серии до тех пор, пока 5 ячеек не будут заполнены этим номером. Затем заполнение столбца продолжается следующим номером. Когда столбец заполнен, процесс переходит к следующему столбцу, пока все 6 чисел не будут добавлены 5 раз и матрица не будет заполнена.

3 Ответов

Рейтинг:
20

OriginalGriff

Вы можете посмотреть здесь: Перестановки, комбинации и вариации с использованием дженериков C# [^] это полная сборка, которая делает все это: комбинации, перестановки ... и это хорошо объясняет само себя.


BillWoodruff

Это отличный ресурс, и вот еще один, более свежий: https://www.codeproject.com/Articles/1250925/Permutations-Fast-implementations-and-a-new-indexi

Richard Deeming

Также отличная многосерийная серия Эрика Липперта на сочетания[^] и перестановки[^]. :)

Member 14561224

Спасибо за ресурс, очень информативный!

OriginalGriff

Всегда пожалуйста!

Maciej Los

5ed!

Рейтинг:
2

dnxit

Хотя это не совсем ясно из вашего вопроса но мое восприятие таково что вы хотите получить все комбинации из одного списка int позвольте мне поделиться некоторым кодом который даст вам 720 комбинаций для

var list = new List<int> { 1, 2, 3, 4, 5, 6 };
var allCombinations = list.Permute().ToList();
var stringList = new List<string>();

foreach (var item in allCombinations)
{
      stringList.Add(string.Join(",", item.Select(n => n.ToString()).ToArray()));
}


Таким образом, stringList будет иметь все ваши комбинации
1,2,3,4,5,6
1,2,3,4,6,5
............
............

public static class Extensions
{
	public static IEnumerable<IEnumerable<T>> Permute<T>(this IEnumerable<T> sequence)
	{
		if (sequence == null)
		{
			yield break;
		}

		var list = sequence.ToList();

		if (!list.Any())
		{
			yield return Enumerable.Empty<T>();
		}
		else
		{
			var startingElementIndex = 0;
			foreach (var startingElement in list)
		    {
				var remainingItems = list.Where((e, i) => i != startingElementIndex);

				foreach (var permutationOfRemainder in remainingItems.Permute())
				{
					yield return startingElement.Concat(permutationOfRemainder);
				}

				startingElementIndex++;
			}
		}
	}

	private static IEnumerable<T> Concat<T>(this T firstElement, IEnumerable<T> secondSequence)
	{
		yield return firstElement;
		if (secondSequence == null)
		{
			yield break;
		}

		foreach (var item in secondSequence)
		{
			yield return item;
		}
	}
}


BillWoodruff

Интересно, можно ли это сделать со стеком, а не с рекурсией?

Member 14561224

Спасибо, это что-то вроде того. Однако то, что я пытаюсь сделать, - это получить комбинацию из 5 цифр из целочисленного списка. Комбинация не должна иметь повторяющихся целых чисел, и порядок не имеет значения; 1, 2, 3-это то же самое, что 1, 3, 2. поэтому, если бы список имел целые числа от 1 до 6, было бы 6 комбинаций, как указано в ОП.

Рейтинг:
1

Patrice T

Цитата:
Я застрял на логике.

Это и есть предмет домашнего задания. Вы должны расшифровать логику.
Прежде всего, возьмите лист бумаги и карандаш, а затем попытайтесь разобраться в некоторой логике в Примере:
- А если в списке есть и другие номера?
- Какие значения может иметь первое число в списке результатов? во-вторых? ...
- какова была его позиция в списке?
- а что, если вы выберете только 1 число? 2? 3?
запишите полученные списки.
сходство тренировок.

Эта поисковая деятельность является основой работы по программированию, по мере приобретения опыта часть этой деятельности также заключается в том, чтобы проверить, похожа ли логика задачи на другую, где известен алгоритм решения.

Если я дам вам только полное взрывное решение, это будет похоже на магию для вас, и вы ничего не узнаете.