列出项目计算

时间:2017-04-05 07:22:00

标签: c# list

假设我有一个整数列表/数组,即:

{1, 2, 3, 4}

有没有办法获得每个可能的添加组合并将它们添加到另一个列表/数组?

像这样:

1+2, 1+3, 1+4, 
2+3, 2+4,
3+4,

1+2+3, 1+2+4, 1+3+4,
2+3+4,

1+2+3+4

所以最终结果是(没有重复):

{3, 4, 5, 6, 7, 8, 9, 10}

2 个答案:

答案 0 :(得分:2)

对于int list更具体,你可以这样做

   static List<int> GetCombination(List<int> list, List<int> combinations, int sumNum, bool addNumberToResult = false)
    {
        if (list.Count == 0) {
            return combinations;
        }

        int tmp;

        for (int i = 0; i <= list.Count - 1; i++) {
            tmp = sumNum + list[i];
            if(addNumberToResult){
                combinations.Add(tmp);
            }
            List<int> tmp_list = new List<int>(list);
            tmp_list.RemoveAt(i);
            GetCombination(tmp_list,combinations,tmp, true);
        }

        return combinations;
    }

并简单地调用它

List<int> numbers = new List<int>(){1,2,3,4,5};
List<int> possibleCombination = GetCombination(numbers, new List<int>(), 0);

并删除重复的

possibleCombination.Distinct()

如果您想要它,请致电

possibleCombination.Distinct().OrderBy(itm => itm)

possibleCombination.Distinct().OrderByDescending(itm => itm)

C# fiddle

编辑:正如皮埃尔正确地指出的那样,代码没有坚持这个问题,我相应地进行了更正,添加了一个参数,用于在结果列表中添加或不添加数字。

答案 1 :(得分:0)

基于此great answer这里有一个版本,可以让你消除&#34;小子集&#34;(*)

public static List<List<T>> GetCombination<T>(List<T> inputList, int minimumItems = 1)
{
    int count = (int)Math.Pow(2, inputList.Count) - 1;
    List<List<T>> result = new List<List<T>>(count + 1);

    if (minimumItems == 0)
        result.Add(new List<T>());

    for (int i = 1; i <= count; i++)
    {
        List<T> combinason = new List<T>(inputList.Count);
        for (int j = 0; j < inputList.Count; j++)
        {
            if ((i >> j & 1) == 1)
                combinason.Add(inputList[j]);
        }

        if (combinason.Count >= minimumItems)
            result.Add(combinason);
    }

    return result;
}

结果:

>> { {1,2}, {1,3}, {2,3}, {1,2,3}, {1,4}, {2,4},
>>   {1,2,4}, {3,4}, {1,3,4}, {2,3,4}, {1,2,3,4}   }

从这里开始,子集上有一个简单的.Sum()

Subsets.ForEach( s => result.Add(s.Sum()) );

如您要清除列表中的每个副本:

DoublonList.Distinct();

C# fiddle

ps:(*)无法用英语找到单词中只有一个元素的单词