110,568
社区成员
发帖
与我相关
我的任务
分享
static class Extend
{
/// <summary>
/// 笛卡尔积
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="sequences"></param>
/// <returns></returns>
public static IEnumerable<IEnumerable<T>> CartesianProduct<T>(
this IEnumerable<IEnumerable<T>> sequences)
{
IEnumerable<IEnumerable<T>> emptyProduct = new[] { Enumerable.Empty<T>() };
return sequences.Aggregate(
emptyProduct,
(accumulator, sequence) =>
from accseq in accumulator
from item in sequence
select accseq.Concat(new[] { item }));
}
/// <summary>
/// 组合
/// </summary>
/// <typeparam name="TValue"></typeparam>
/// <param name="values"></param>
/// <param name="num"></param>
/// <returns></returns>
public static IEnumerable<IEnumerable<TValue>> Combination<TValue>(
this IEnumerable<TValue> values,
// Int32 count,
Int32 num)
{
var t = Enumerable.Range(0, num).ToList();
do
{
yield return values.Where((x, i) => t.Contains(i));
}
while (NextCombination(t, values.Count(), num));
}
/// <summary>
/// C(n,m) 的下一项
/// </summary>
/// <param name="ar"></param>
/// <param name="num"></param>
/// <param name="k"></param>
/// <returns></returns>
public static bool NextCombination(List<int> ar, int n, int m)
{
if (ar.Count() != m) ar = Enumerable.Range(0, m).ToList();
bool changed = false, finished = false;
if (m > 0)
{
for (int i = m - 1; !changed && !finished; i--)
{
if (ar[i] < (n - 1) - (m - 1) + i)
{
ar[i]++;
if (i < m - 1)
{
for (int j = i + 1; j < m; j++)
{
ar[j] = ar[j - 1] + 1;
}
}
changed = true;
}
finished = (i == 0);
}
}
return changed;
}
public static IEnumerable<IEnumerable<TValue>> Permutation<TValue>(
this IEnumerable<TValue> values )
{
var t = Enumerable.Range(0, values.Count()).ToList();
var p = values.ToList();
do
{
yield return t.Select(i => p[i]);
}
while (NextPermutation(t));
}
/// <summary>
/// P(n) 的下一项
/// </summary>
/// <param name="a"></param>
/// <returns></returns>
public static bool NextPermutation(List<int> a)
{
int first = 0;
int last = a.Count;
int c, j, m, n;
int i = last;
i--;
while (true)
{
var t = i;
i--;
if (a[i] < a[t])
{
j = last;
while (!(a[i] < a[--j])) ;
c = a[i];
a[i] = a[j];
a[j] = c;
m = t;
n = last - 1;
while (m < n)
{
c = a[n];
a[n] = a[m];
a[m] = c;
m++;
n--;
}
return true;
}
if (i == first)
{
m = first;
n = last - 1;
while (m < n)
{
c = a[n];
a[n] = a[m];
a[m] = c;
m++;
n--;
}
return false;
}
}
}
}
var a = new[] { "A", "B", "C", "D", "E", "F", "G" };
for (var i = 1; i < 8; i++)
{
foreach (var x in a.Combination(i))
{
Console.WriteLine(string.Join("", x));
}
}
A
B
C
D
E
F
G
AB
AC
AD
AE
AF
AG
BC
BD
BE
BF
BG
CD
CE
CF
CG
DE
DF
DG
EF
EG
FG
ABC
ABD
ABE
ABF
ABG
ACD
ACE
ACF
ACG
ADE
ADF
ADG
AEF
AEG
AFG
BCD
BCE
BCF
BCG
BDE
BDF
BDG
BEF
BEG
BFG
CDE
CDF
CDG
CEF
CEG
CFG
DEF
DEG
DFG
EFG
ABCD
ABCE
ABCF
ABCG
ABDE
ABDF
ABDG
ABEF
ABEG
ABFG
ACDE
ACDF
ACDG
ACEF
ACEG
ACFG
ADEF
ADEG
ADFG
AEFG
BCDE
BCDF
BCDG
BCEF
BCEG
BCFG
BDEF
BDEG
BDFG
BEFG
CDEF
CDEG
CDFG
CEFG
DEFG
ABCDE
ABCDF
ABCDG
ABCEF
ABCEG
ABCFG
ABDEF
ABDEG
ABDFG
ABEFG
ACDEF
ACDEG
ACDFG
ACEFG
ADEFG
BCDEF
BCDEG
BCDFG
BCEFG
BDEFG
CDEFG
ABCDEF
ABCDEG
ABCDFG
ABCEFG
ABDEFG
ACDEFG
BCDEFG
ABCDEFG