C# 列表组合c

C# 列表组合c,c#,.net,combinations,C#,.net,Combinations,我有4个系列 { A1, A2, A3, ...} { B1, B1, B3, ...} { C1, C2, C3, ...} { D1, D2, D3, ...} 我需要使用以下规则找到所有可能的组合: 第一套和第四套中的1件 第二个系列中的2项 第三组中的3项 示例组合: VisualStudio加载时间太长,所以我使用JavaScript进行加载,因为我可以在控制台中进行测试。这将打印出所有选项。这听起来更像是一个问题,这个问题的算法是什么?不是,C语言中的算法是什么 要查看it工作的示

我有4个系列

{ A1, A2, A3, ...}
{ B1, B1, B3, ...}
{ C1, C2, C3, ...}
{ D1, D2, D3, ...}
我需要使用以下规则找到所有可能的组合:

第一套和第四套中的1件 第二个系列中的2项 第三组中的3项 示例组合:


VisualStudio加载时间太长,所以我使用JavaScript进行加载,因为我可以在控制台中进行测试。这将打印出所有选项。这听起来更像是一个问题,这个问题的算法是什么?不是,C语言中的算法是什么

要查看it工作的示例,您可以执行以下操作:

var testGroup = makeGroup('T', 4);

var choose1 = choose(testGroup, 1);
var choose2 = choose(testGroup, 2);
var choose3 = choose(testGroup, 3);

console.log(JSON.stringify(choose1));
console.log(JSON.stringify(choose2));
console.log(JSON.stringify(choose3));
并确保选择正确:

[["T1"],["T2"],["T3"],["T4"]]
[["T1","T2"],["T1","T3"],["T1","T4"],["T2","T3"],["T2","T4"],["T3","T4"]]
[["T1","T2","T3"],["T1","T2","T4"],["T1","T3","T4"],["T2","T3","T4"]]
输出如下:

a1b1b2c1c2c3d1 a2b3b4c4c5c6d2

我创建此代码是为了满足您的需要:

var aa = new[] { "A1", "A2", "A3", "A4" };
var bb = new[] { "B1", "B2", "B3", "B4" };
var cc = new[] { "C1", "C2", "C3", "C4" };
var dd = new[] { "D1", "D2", "D3", "D4" };

var query =
    from a in aa.SelectMembers()
    from b1 in bb.SelectMembers()
    from b2 in b1.Remainder.SelectMembers()
    from c1 in cc.SelectMembers()
    from c2 in c1.Remainder.SelectMembers()
    from c3 in c2.Remainder.SelectMembers()
    from d in aa.SelectMembers()
    select new []
    {
        a.Selected, b1.Selected, b2.Selected, c1.Selected,
        c2.Selected, c3.Selected, d.Selected,
    };
例如,它产生4608个组合

A1, B1, B2, C1, C2, C3, A1 
A1, B1, B2, C1, C2, C3, A2 
A1, B1, B2, C1, C2, C3, A3 
...
A4, B4, B3, C4, C3, C2, A3 
A4, B4, B3, C4, C3, C2, A4 
您需要的两个支持代码位是:

public static class Ex
{
    public static IEnumerable<Member<T>> SelectMembers<T>(this IEnumerable<T> @this)
    {
        if (@this == null || !@this.Any())
        {
            yield break;
        }
        else
        {
            for (var i = 0; i < @this.Count(); i++)
            {
                yield return new Member<T>(@this.Skip(i).First(), @this.Take(i).Concat(@this.Skip(i + 1)));
            }
        }
    }
}

public sealed class Member<T>
{ 
    private readonly T _Selected; 
    private readonly IEnumerable<T> _Remainder; 

    public T Selected { get { return _Selected; } } 
    public IEnumerable<T> Remainder { get { return _Remainder; } } 

    public Member(T Selected, IEnumerable<T> Remainder) 
    { 
        _Selected = Selected; 
        _Remainder = Remainder;    
    } 
}

这个问题太宽泛,解释得不好。请发布你迄今为止所做的尝试。不幸的是,我不得不想办法解决这个问题。我想一组for循环可以给我组合,但我不确定。你需要可能组合的数量吗?还是怎样您希望如何格式化输出?你需要提供更多的信息。@谁在乎,你设计了这个逻辑吗?我可以画我需要的东西。但我不知道如何实现它。
        string[] A = { "a1", "a2", "a3", "a4", "a5" };
        string[] B = { "b1", "b2", "b3", "b4", "b5", "b6", "b7", "b8", "b9", "b10"};
        string[] C = { "c1", "c2", "c3", "c4", "c5", "c6", "c7", "c8", "c9", "c10", "c11", "c12", "c13", "c14", "c15"};
        string[] D = { "d1", "d2", "d3", "d4", "d5"};
        for(int i=0; i<A.Length;i++)
        {
            Console.Write(A[i]);
            for (int j = i * 2; j < i*2 +2; j++)
            {
                Console.Write(B[j]);                    
            }
            for (int k = i * 3; k < i*3+3; k++)
            {
                Console.Write(C[k]);
            }
            Console.WriteLine(D[i]);
        }
        Console.Read();
var aa = new[] { "A1", "A2", "A3", "A4" };
var bb = new[] { "B1", "B2", "B3", "B4" };
var cc = new[] { "C1", "C2", "C3", "C4" };
var dd = new[] { "D1", "D2", "D3", "D4" };

var query =
    from a in aa.SelectMembers()
    from b1 in bb.SelectMembers()
    from b2 in b1.Remainder.SelectMembers()
    from c1 in cc.SelectMembers()
    from c2 in c1.Remainder.SelectMembers()
    from c3 in c2.Remainder.SelectMembers()
    from d in aa.SelectMembers()
    select new []
    {
        a.Selected, b1.Selected, b2.Selected, c1.Selected,
        c2.Selected, c3.Selected, d.Selected,
    };
A1, B1, B2, C1, C2, C3, A1 
A1, B1, B2, C1, C2, C3, A2 
A1, B1, B2, C1, C2, C3, A3 
...
A4, B4, B3, C4, C3, C2, A3 
A4, B4, B3, C4, C3, C2, A4 
public static class Ex
{
    public static IEnumerable<Member<T>> SelectMembers<T>(this IEnumerable<T> @this)
    {
        if (@this == null || !@this.Any())
        {
            yield break;
        }
        else
        {
            for (var i = 0; i < @this.Count(); i++)
            {
                yield return new Member<T>(@this.Skip(i).First(), @this.Take(i).Concat(@this.Skip(i + 1)));
            }
        }
    }
}

public sealed class Member<T>
{ 
    private readonly T _Selected; 
    private readonly IEnumerable<T> _Remainder; 

    public T Selected { get { return _Selected; } } 
    public IEnumerable<T> Remainder { get { return _Remainder; } } 

    public Member(T Selected, IEnumerable<T> Remainder) 
    { 
        _Selected = Selected; 
        _Remainder = Remainder;    
    } 
}