假设我有一个整数列表/数组,即:
{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}
答案 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)
编辑:正如皮埃尔正确地指出的那样,代码没有坚持这个问题,我相应地进行了更正,添加了一个参数,用于在结果列表中添加或不添加数字。
答案 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();
ps:(*)无法用英语找到单词中只有一个元素的单词