배열에 저장된 모든 가능한 숫자 조합을 얻고 싶습니다.
예를 들면 :
{1,2,3,4} 반환의 첫 번째 배열 사용
1,2,3,4
1,3,4,2
1,4,2,3
2,3,4,1
2,4,1,3 etc
어떻게 할 수 있습니까?
명확히하기 위해-{1,2,3,4}의 숫자 배열을 취하고, 숫자 시퀀스를 재정렬하고, 새 배열을 반환하고 (목록에 추가) 가능한 모든 조합을 찾을 때까지 반복합니다.
감사
여기에 당신이 원하는 것을 정확히 포함 하는 대답 이 있습니다. 다른 답변을 읽으면 더 빨리 작동하는 몇 가지 다른 접근 방식이 있지만 사용하기가 조금 더 복잡합니다.
이것은 내 자신이 아닌 관련 코드입니다.
public static IEnumerable<IEnumerable<T>> QuickPerm<T>(this IEnumerable<T> set)
{
int N = set.Count();
int[] a = new int[N];
int[] p = new int[N];
var yieldRet = new T[N];
List<T> list = new List<T>(set);
int i, j, tmp; // Upper Index i; Lower Index j
for (i = 0; i < N; i++)
{
// initialize arrays; a[N] can be any type
a[i] = i + 1; // a[i] value is not revealed and can be arbitrary
p[i] = 0; // p[i] == i controls iteration and index boundaries for i
}
yield return list;
//display(a, 0, 0); // remove comment to display array a[]
i = 1; // setup first swap points to be 1 and 0 respectively (i & j)
while (i < N)
{
if (p[i] < i)
{
j = i%2*p[i]; // IF i is odd then j = p[i] otherwise j = 0
tmp = a[j]; // swap(a[j], a[i])
a[j] = a[i];
a[i] = tmp;
//MAIN!
for (int x = 0; x < N; x++)
{
yieldRet[x] = list[a[x]-1];
}
yield return yieldRet;
//display(a, j, i); // remove comment to display target array a[]
// MAIN!
p[i]++; // increase index "weight" for i by one
i = 1; // reset index i to 1 (assumed)
}
else
{
// otherwise p[i] == i
p[i] = 0; // reset p[i] to zero
i++; // set new index value for i (increase by one)
} // if (p[i] < i)
} // while(i < N)
}
이 확장 방법을 사용 array.QuickParm.Select(innerEnum => innerEnum.ToArray()).ToArray()
하면 배열의 배열로 결과를 얻을 수 있습니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다