【发布时间】:2018-10-17 21:08:02
【问题描述】:
这个问题已经被问过很多次了,但是我看到的每一个 SO 帖子都需要一个特定的值长度,而我只想知道每个独特的组合,无论长度如何。
下面的代码仅提供了一个列表,其中恰好有 3 个组合条目(并且它们不是唯一的)。
List<string> list = new List<string> { "003_PS", "003_DH", "003_HEAT" };
var perms = list.GetPermutations();
public static class Extensions
{
public static IEnumerable<IEnumerable<T>> GetPermutations<T>(this IEnumerable<T> items)
{
foreach (var item in items)
{
var itemAsEnumerable = Enumerable.Repeat(item, 1);
var subSet = items.Except(itemAsEnumerable);
if (!subSet.Any())
{
yield return itemAsEnumerable;
}
else
{
foreach (var sub in items.Except(itemAsEnumerable).GetPermutations())
{
yield return itemAsEnumerable.Union(sub);
}
}
}
}
}
/*
OUTPUT:
003_PS, 003_DH, 003_HEAT
003_PS, 003_HEAT, 003_DH
003_DH, 003_PS, 003_HEAT
003_DH, 003_HEAT, 003_PS
003_HEAT, 003_PS, 003_DH
003_HEAT, 003_DH, 003_PS
*/
我要找的是这个:
/*
OUTPUT:
003_PS, 003_DH, 003_HEAT
003_PS, 003_DH
003_PS, 003_HEAT
003_PS
003_DH, 003_HEAT
003_DH
003_HEAT
*/
大小不限3件,每个条目都是唯一的。
我需要在此功能中进行哪些更改?我愿意接受 LINQ 解决方案
感谢任何帮助。谢谢!
编辑:上面的列表输出不准确
**编辑#2: 这是我正在寻找的 Javascript 版本。但我不知道 C# 等效语法是什么:
function getUniqueList(arr){
if (arr.length === 1) return [arr];
else {
subarr = getUniqueList(arr.slice(1));
return subarr.concat(subarr.map(e => e.concat(arr[0])), [[arr[0]]]);
}
}
.
【问题讨论】:
-
你试过这个答案吗? stackoverflow.com/a/40417765/1863970
-
我一直在寻找这个将近 2 小时,你在几分钟内就找到了它......谢谢
-
由于 OP 承认他的问题已由 All Possible Combinations of a list of Values 回答,因此投票决定作为副本关闭。
标签: c# combinations permutation