int iterationMax = 1;
double actualMax = 0;
int A = 3;
List<double> tmp = new List<double> { 400, 0, -300, 400, 600 ,300, 400,
1200, 900, 400, 1200, 1500};
List<double> listMax = new List<double>();
for (int i = 0; i < tmp.Count; i++)
{
if (iterationMax < A) // A == 3
{
if (tmp[i] > actualMax)
{
actualMax = tmp[i];
}
iterationMax++;
}
else
{
listMax.Add(actualMax);
actualMax = 0;
iterationMax = 1;
}
}
Console.WriteLine("\nMaxs: ");
foreach (double max in listMax)
{
Console.Write(max + ", ");
}
列出tmp hold = { 400,0,-300|400,600,300|400,1200,900|400,1200,1500}
,
制作400, 600, 1200, 1200
,
应该是400, 600, 1200, 1500
。我不知道如何输入else语句将1500添加到列表中。
我只想从每3个元素中获得最大值。
答案 0 :(得分:4)
当需要对收集进行操作时,使用Linq会好很多倍。
在GroupBy
中使用index/3
,因为它是int
,每个以下3项将有不同的key
。然后为每个组选择最大值:
var items = new int[] { 400, 0, -300, 400, 600, 300, 400, 1200, 900 };
var results = items.Select((item, index) => new { item, index })
.GroupBy(item => item.index / 3)
.Select(group => group.Max(item => item.item));
//400, 600, 1200
答案 1 :(得分:1)
您的代码的快速修复将是:
var A = 3;
int iterationMax = 0;
double actualMax = 0;
List<double> tmp = new List<double> {400,0,-300,400,600,300,400,1200,900,400,1200,1500};
List<double> listMax = new List<double>();
for (int i = 0; i < tmp.Count; i++)
{
if (iterationMax < A) // A == 3
{
if (tmp[i] > actualMax)
{
actualMax = tmp[i];
}
iterationMax++;
}
if (iterationMax == A)
{
listMax.Add(actualMax);
actualMax = 0;
iterationMax = 0;
}
}
Console.WriteLine("\nMaxs: ");
foreach (double max in listMax)
{
Console.Write(max + ", ");
}
正如其他人所说,从iterationMax
开始0
并将else
变为if (iterationMax == A)
。
答案 2 :(得分:0)
在初始化和其他情况下将iterationMax设置为0应解决您的问题。
目前,您的if结构只会检查三个元素中的前两个元素。由于1500是元素#3,因此不会进行检查。
答案 3 :(得分:0)
问题是,当iterationMax
达到3时,你没有对temp中的值做任何事情,那个循环就会丢失。
for (int i = 0; i < tmp.Count; i++)
{
if (tmp[i] > actualMax)
{
actualMax = tmp[i];
}
iterationMax++;
if (iterationMax > A)
{
listMax.Add(actualMax);
actualMax = 0;
iterationMax = 1;
}
}