これについては絶対に気にしないでください。それはその日の1つです。しかし、私は特定の長さのアイテムのリストのユニークな組み合わせを取得するための解決策を探していました。たとえば、リスト[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;
}
}
これは本来の機能を実行しますが、一意であるかどうかに関係なく、すべての順列を返します。一意の値を取得するために、このコードのどの部分を変更するかについて頭を悩ませようとしました。または、この機能を実装するためのより良い方法はありますか?