C# 获得所有可能的组合并求和结果

C# 获得所有可能的组合并求和结果,c#,linq,C#,Linq,我有一个简单的Player对象列表,如下所示 Name | Team | Position | Total Tom Brady | Team 1 | QB | 200 Adrian Peterson | Team 1 | RB | 250 Calvin Johnson | Team 2 | WR | 260 LeVon Bell | Team 2 | RB | 220 Peyton Ma

我有一个简单的Player对象列表,如下所示

Name | Team | Position | Total Tom Brady | Team 1 | QB | 200 Adrian Peterson | Team 1 | RB | 250 Calvin Johnson | Team 2 | WR | 260 LeVon Bell | Team 2 | RB | 220 Peyton Manning | Team 3 | QB | 220 Arian Foster | Team 3 | RB | 220 姓名|团队|职位|总计 汤姆·布雷迪|第一队| QB | 200 阿德里安·彼得森|第一队| RB | 250 卡尔文·约翰逊|第2队| WR | 260 LeVon Bell |第2队| RB | 220 佩顿·曼宁|第三队| QB | 220 Arian Foster |第三队| RB | 220 这是一个简单的示例,实际上大约有200条记录。我想做的是得到每支球队所有可能的球员组合,并将他们的总数相加,因此最终结果如下

Name | Team | Position | Total Tom Brady | Team 1 | QB | 200 Adrian Peterson | Team 1 | RB | 250 Calvin Johnson | Team 2 | WR | 260 LeVon Bell | Team 2 | RB | 220 Peyton Manning | Team 3 | QB | 220 Arian Foster | Team 3 | RB | 220 可能性

Teams | Players | Total Team 1 | Tom Brady, Adrian Peterson | 450 Team 2 | Calvin Johnson, LeVon Bell | 480 Team 3 | Peyton Manning, Arian Foster | 440 球队|球员|总数 第一队|汤姆·布雷迪、阿德里安·彼得森| 450 第2队|卡尔文·约翰逊,列文·贝尔| 480 第三队|佩顿·曼宁,阿里安·福斯特| 440
基本上我在寻找交易的可能性,所以我需要得到每个球队的球员组合。我正在寻找的最大可能的组合是每队5名球员,我会将球员和他们的积分组合在一个新对象中。现在我可以用下面的工具到达那里

  var playerList = players.GroupBy(p => p.Team)
    .Select(g => new
    {
        Team = g.Key,
        g
    }).ToList();

        List<Possibilities> possibilities = new List<Possibilities>();

        foreach (var a in playerList)
        {
            List<Possibilities> onePlayer = (from b in a.g
                                             select new Possibilities
                                             {
                                                 Players = b.Name,
                                                 Total = b.Total,
                                                 Team = a.Team
                                             }).ToList();


            List<Possibilities> twoPlayer = (from b in a.g
                                             from c in a.g
                                             select new Possibilities
                                             {
                                                 Players = b.Name + ", " + c.Name,
                                                 Total = b.Total + c.Total,
                                                 Team = a.Team
                                             }).ToList();
var playerList=players.GroupBy(p=>p.Team)
.选择(g=>new
{
团队=g.键,
G
}).ToList();
列表可能性=新列表();
foreach(playerList中的变量a)
{
列出一个玩家=(从a.g中的b开始)
选择新的可能性
{
玩家=b.姓名,
总计=b.总计,
团队
}).ToList();
列出twoPlayer=(从a.g中的b开始)
a.g.中的c
选择新的可能性
{
玩家=b.姓名+“,”c.姓名,
总计=b.总计+c.总计,
团队
}).ToList();

这给了我每个队1,2,3名球员的所有组合,但我想添加4和5。这也不会删除重复组合(球员1、球员2和球员2、球员1)。有没有更简洁的方法来实现这一点?

虽然可能效率很低,但下面的方法可能会奏效。当然,这只是一个简单的示例,您需要根据自己的情况调整代码

static void Main(string[] args)
    {
        var nums = new[] { 1, 2, 3, 4, 5, 6 };
        var combinations = new List<int[]>();
        int[] current;

        foreach (int i in nums)
        {
            combinations.Add(new[] { i });

            foreach (int j in nums.Where(n => n != i))
            {
                current = new[] { i, j };
                if (!combinations.Any(c => current.Length == c.Length && current.All(n => c.Contains(n))))
                {
                    combinations.Add(current);
                }

                foreach (int k in nums.Where(n => n != i && n != j))
                {
                    current = new[] { i, j, k };
                    if (!combinations.Any(c => current.Length == c.Length && current.All(n => c.Contains(n))))
                    {
                        combinations.Add(current);
                    }

                    foreach (int l in nums.Where(n => n != i && n != j && n != k))
                    {
                        current = new[] { i, j, k, l };
                        if (!combinations.Any(c => current.Length == c.Length && current.All(n => c.Contains(n))))
                        {
                            combinations.Add(current);
                        }

                        foreach (int m in nums.Where(n => n != i && n != j && n != k && n != l))
                        {
                            current = new[] { i, j, k, l, m };
                            if (!combinations.Any(c => current.Length == c.Length && current.All(n => c.Contains(n))))
                            {
                                combinations.Add(current);
                            }
                        }
                    }
                }
            }
        }

        foreach (var c in combinations)
        {
            foreach (var num in c)
            {
                Console.Write(num + " ");
            }

            Console.WriteLine();
        }

        Console.ReadKey();
    }
static void Main(字符串[]args)
{
var nums=new[]{1,2,3,4,5,6};
变量组合=新列表();
int[]电流;
foreach(整数i,单位为nums)
{
添加(新[]{i});
foreach(整数j,单位为nums.Where(n=>n!=i))
{
当前=新[]{i,j};
如果(!combines.Any(c=>current.Length==c.Length&¤t.All(n=>c.Contains(n)))
{
组合。添加(当前);
}
foreach(整数k,单位为nums.Where(n=>n!=i&&n!=j))
{
当前=新[]{i,j,k};
如果(!combines.Any(c=>current.Length==c.Length&¤t.All(n=>c.Contains(n)))
{
组合。添加(当前);
}
foreach(整数l,单位为nums.Where(n=>n!=i&&n!=j&&n!=k))
{
当前=新[]{i,j,k,l};
如果(!combines.Any(c=>current.Length==c.Length&¤t.All(n=>c.Contains(n)))
{
组合。添加(当前);
}
foreach(整数m,单位为nums,其中(n=>n!=i&&n!=j&&n!=k&&n!=l))
{
电流=新[]{i,j,k,l,m};
如果(!combines.Any(c=>current.Length==c.Length&¤t.All(n=>c.Contains(n)))
{
组合。添加(当前);
}
}
}
}
}
}
foreach(组合中的var c)
{
foreach(c中的var num)
{
Console.Write(num+“”);
}
Console.WriteLine();
}
Console.ReadKey();
}

您可以生成有限项目集的所有组合(如果项目数量是多少,看起来你只想分组在
团队
,但你说的每个团队最多有20名球员是什么意思,并且每个组合最多可以组合5名球员,因此如果你想要所有组合,我预计每个团队的可能性为15.5k。你的示例不应该包括每个组合的可能性吗只有一名球员的球队?问题有点不清楚。我会尝试重新表述它,或者发布您迄今为止编写的代码。基本上,我正在寻找交易可能性,所以我需要获得每个球队的球员组合。我寻找的最大可能组合是每个球队5名球员,我会将球员和他们的积分组合在一起一个新的对象。这有意义吗?也许?问题是你正在尝试生成每个团队的不同子集,包括2到5个成员?感谢这一点,我将研究它,因为我不仅要得到组合,还要计算字段,在这期间,可能需要更多的思考。
A,B
A,C
B,C
A,B,C
A,D
B,D
A,B,D
C,D
A,C,D
B,C,D
using System;
using System.Collections.Generic;

namespace ConsoleApplication1
{
    public class Program
    {
        public static void Main()
        {
            var data = new [] {"A", "B", "C", "D"};

            // Get all the combinations of elements from A,B,C,D with between 2 and 3 values:

            var combinations = Combinations(data, 2, 3);

            // Combinations() has returned an IEnumerable<IEnumberable<T>>,
            // that is, a sequence of subsequences where each subsequence is one combination.

            foreach (var combination in combinations)
                Console.WriteLine(string.Join(",", combination));
        }

        public static IEnumerable<IEnumerable<T>> Combinations<T>(T[] input, int minElements, int maxElements)
        {
            int numCombinations = 2 << (input.Length - 1);

            for (int bits = 0; bits < numCombinations; ++bits)
            {
                int bitCount = NumBitsSet(bits);

                if (minElements <= bitCount && bitCount <= maxElements)
                    yield return combination(input, bits);
            }
        }

        private static IEnumerable<T> combination<T>(T[] input, int bits)
        {
            for (int bit = 1, i = 0; i < input.Length; ++i, bit <<= 1)
                if ((bits & bit) != 0)
                    yield return input[i];
        }

        public static int NumBitsSet(int i)
        {
            i = i - ((i >> 1) & 0x55555555);
            i = (i & 0x33333333) + ((i >> 2) & 0x33333333);
            return (((i + (i >> 4)) & 0x0F0F0F0F) * 0x01010101) >> 24;
        }
    }
}