我有一个包含值10,20,30,50,30
的列表我想添加列表中存在的所有可能的值:
10+20 = 30
10+30 = 40
10+50 = 60
20+30 = 50
10+20+30+50+30
我声明的列表是这样的:
列表列表=新列表();
使用for循环添加和值(即10,20,30,50,30)。
到目前为止:
List<int> list = new List<int>();
list.Add(3);
list.Add(7);
list.Add(8);
list.Add(1);
var length = list.Count();
for (int i = 0; i < length; i++)
{
var sum = 0;
sum = sum + list[i];
for (int j = i + 1; j < length; j++)
{
sum = sum + list[j];
list.Add(list[i] + list[j]);
}
list.Add(sum);
}
答案 0 :(得分:0)
如果您只想要2个元素,通常会使用两个for循环来完成。但是,如果您想从1到所有元素中选择所有组合,那么您正在寻找power set。
我会回答它只是选择2
List<int> sums = new List<int>();
for(int first = list.Length - 1; first >= 1; first--)
{
for(int second = first - 1; second >= 0; second--)
{
sums.Add(list[first] + list[second]);
}
}
您还应该将其括起来以确保您的列表中至少包含2个项目...
修改强> 由于您已更新了问题以显示您的实施,因此我将包含用于生成电源设置的代码
public IEnumerable<IEnumerable<int>> PowerSet(IEnumerable<int> initialSet)
{
foreach (IEnumerable<int> set in PowerSetRecursive(initialSet, initialSet.Count() - 1))
{
yield return set;
}
}
private IEnumerable<IEnumerable<int>> PowerSetRecursive(IEnumerable<int> initialSet, int index)
{
if (index == 0)
{
yield return new int[] { };
yield return new int[] { initialSet.ElementAt(index) };
}
else
{
foreach (IEnumerable<int> set in PowerSetRecursive(initialSet, index - 1))
{
yield return new HashSet<int>(set);
yield return new HashSet<int>(set) { initialSet.ElementAt(index) };
}
}
}
然后你会像这样循环
foreach (IEnumerable<int> set in PowerSet(new int[] { 1, 2, 3, 4 }))
{
Console.WriteLine(set.Sum());
}
答案 1 :(得分:0)
这对我有用:
Func<IEnumerable<int>, IEnumerable<int>> getAllSelectionSums = null;
getAllSelectionSums = xs =>
{
if (!xs.Any())
{
return new [] { 0 };
}
else
{
return
from h in xs.Take(1).Concat(new [] { 0 })
from t in getAllSelectionSums(xs.Skip(1))
select h + t;
}
};
因此,给定var source = new [] { 3, 7, 8, 1 };
作为输入,我得到以下结果: