对此绝对头脑一片空白。这是那些日子之一。但我一直在寻找一种解决方案来获得一定长度的项目列表的独特组合。例如,给定一个列表 [a, b, c] 和长度为 2,它将返回 [a,b] [a,c] [b,c] 但不返回 [b,a] [c,a] [c ,b]
为此,我发现了许多代码,但似乎没有一个适合。以下代码似乎最合适,我一直在尝试根据需要对其进行更改:
// Returns an enumeration of enumerators, one for each permutation
// of the input.
public static IEnumerable<IEnumerable<T>> Permute<T>(IEnumerable<T> list, int count)
{
if (count == 0)
{
yield return new T[0];
}
else
{
int startingElementIndex = 0;
foreach (T startingElement in list)
{
IEnumerable<T> remainingItems = AllExcept(list, startingElementIndex);
foreach (IEnumerable<T> permutationOfRemainder in Permute(remainingItems, count - 1))
{
yield return Concat<T>(
new T[] { startingElement },
permutationOfRemainder);
}
startingElementIndex += 1;
}
}
}
// Enumerates over contents of both lists.
public static IEnumerable<T> Concat<T>(IEnumerable<T> a, IEnumerable<T> b)
{
foreach (T item in a) { yield return item; }
foreach (T item in b) { yield return item; }
}
// Enumerates over all items in the input, skipping over the item
// with the specified offset.
public static IEnumerable<T> AllExcept<T>(IEnumerable<T> input, int indexToSkip)
{
int index = 0;
foreach (T item in input)
{
if (index != indexToSkip) yield return item;
index += 1;
}
}
这完成了它应该做的事情,但它返回所有排列,不管它们是唯一的。我试图弄清楚这段代码的哪一部分(如果有的话)要更改以获得唯一值。或者是实现此功能的更好方法?