C# 计算数组中的最大值和最小值

C# 计算数组中的最大值和最小值,c#,arrays,element,C#,Arrays,Element,我有一个整数数组,需要找到最大数和最小数在数组中的位置。我有它的工作,但它似乎不是一个很好的方式来做。有谁能提出一个更好的方法来实现我所拥有的 这是我的密码: int[] usageHours = { 3, 3, 5, 4, 0, 0, 2, 2, 4, 25, 158, 320, 212, 356, 401, 460, 480, 403, 298, 213, 102, 87, 34, 45 }; double myAverage = usageHours.Average(); int runn

我有一个整数数组,需要找到最大数和最小数在数组中的位置。我有它的工作,但它似乎不是一个很好的方式来做。有谁能提出一个更好的方法来实现我所拥有的

这是我的密码:

int[] usageHours = { 3, 3, 5, 4, 0, 0, 2, 2, 4, 25, 158, 320, 212, 356, 401, 460, 480, 403, 298, 213, 102, 87, 34, 45 };
double myAverage = usageHours.Average();
int runningTotal = 0;
int runningMaxPosition = 0;

for (int i = 0; i < usageHours.Length; i++)
{
    if (usageHours[i] > runningTotal)
    {
        runningMaxPosition = i;
        runningTotal = usageHours[i];
    }
}

txtmax.Text = Convert.ToString(runningMaxPosition)+" With: "+Convert.ToString(runningTotal)+" Users";
txtAv.Text = Convert.ToString(myAverage);
int[]usageHours={3,3,5,4,0,2,2,4,25,158,320,212,356,401,460,480,403,298,213,102,87,34,45};
double myAverage=usageHours.Average();
int runningTotal=0;
int runningMaxPosition=0;
for(int i=0;i运行总数)
{
runningMaxPosition=i;
运行总时间=使用小时数[i];
}
}
txtmax.Text=Convert.ToString(runningMaxPosition)+“With:”+Convert.ToString(runningTotal)+“Users”;
txtAv.Text=Convert.ToString(myAverage);

抓取linq代码,它没有按照您想要的方式工作

你可以让你的代码更简洁一点

for (int i = 0; i < usageHours.Length; i++)
{
    if (usageHours[i] > usageHours[runningMaxPosition])
        runningMaxPosition = i;
}
for(int i=0;iusageHours[runningMaxPosition])
runningMaxPosition=i;
}

它所做的不同之处在于去掉了临时runningTotal变量。

代码看起来可以找到最大值。如果您使用的是C#3或更高版本,您可以使用LINQ扩展方法(有
Min
Max
Average
方法,在
List
上还有一个
FindIndex
方法,等等),但我觉得您正在学习编程,然后,为了学习的价值,有时实施框架中可能内置的东西是一个好主意。

这个怎么样:

double average = usageHours.Average();
int maxPosition = Enumerable.Range(0, usageHours.Length).Max(i => usageHours[i]);
int minPosition = Enumerable.Range(0, usageHours.Length).Min(i => usageHours[i]);

代码基本上是好的。我建议稍微更改变量名,但仅此而已。你可以在同一个循环中求出最小值。我对“if”条件做了非常细微的更改,以保证它们总是选择至少一个元素(即使所有的值都是,比如,
int.MinValue
)。还有其他的方法,但这只是一个例子。如果您有一个空数组,那么结果将是max=min=0,并且两个索引都为-1

int currentMax = 0;
int currentMaxIndex = -1;
int currentMin = 0;
int currentMinIndex = -1;

for (int i = 0; i < usageHours.Length; i++)
{
    if (currentMaxIndex == -1 || usageHours[i] > currentMax)
    {
        currentMaxIndex = i;
        currentMax = usageHours[i];
    }
    if (currentMinIndex == -1 || usageHours[i] < currentMin)
    {
        currentMinIndex = i;
        currentMin = usageHours[i];
    }
}
int currentMax=0;
int currentMaxIndex=-1;
int currentMin=0;
int currentMinIndex=-1;
for(int i=0;icurrentMax)
{
currentMaxIndex=i;
currentMax=使用小时数[i];
}
如果(currentMinIndex==-1 | | usageHours[i]
下面是另一种使用可空值类型表示“没有值”答案的方法:

int currentMax?=无效的
int currentMaxIndex?=无效的
int currentMin?=无效的
int currentMinIndex?=无效的
for(int i=0;icurrentMax.Value)
{
currentMax=i;
currentMax=使用小时数[i];
}
if(currentMin==null | | usageHours[i]

如果您还没有遇到可为null的值类型,请不要担心…

您的代码还不错,但是如果所有值都小于零,那么它将无法工作

试试这个:

int getArrayMaxPosition (double[] theArray) 
{    
    double maxVal = theArray[0];
    int ret = 0;
    int currentIndex = 0;

    foreach (double aValue in theArray) 
    {
        if (aValue > maxVal)
        {
             ret = currentIndex;
             maxVal = avalue;
        }
        currentIndex++;
    }

    return ret;
 }

正如在对Jon回答的评论中提到的,Jon的解决方案确实是最好、最直接、最快捷的方法

但是,如果您确实想使用Igor的解决方案,下面是其其余部分(以获取实际位置和值):


我只是想为这个问题提供一个线性解决方案(为了完整性)。 在OP的原始问题中,他只要求索引最大值和索引最小值

让我们坚持这个问题。这是最有趣的问题,因为要找到最大值,我们可以简单地使用Enumerable.Max LINQ方法。最小值和平均值也是如此

让我们只提供max的索引,min的索引可以用类似的代码检索

int indexOfMax = Enumerable.Range(0, usageHours.Length).Aggregate(
    (indexOfMax, i) => (usageHours[i] > usageHours[indexOfMax] ? i : indexOfMax)
);

为数组的每个索引执行聚合括号内的委托。它作为参数“迄今为止发现的最大值索引”和当前索引获取。它返回“迄今为止找到的最大值索引”。显然,在每次迭代中,“迄今为止找到的最大值索引”只会在数组的对应元素大于之前的最大值时更改为当前索引

他需要max和min的索引,而不仅仅是它们的值。这不是返回min和max值,而不是数组索引吗?这会得到max和min值,但不是这些值的索引。更改为更可能是更好的答案。然后可以使用((IList)usageHours)。IndexOf来查找这两个值的索引。然而,我敢打赌,因为这是一个大学问题,他们希望你演示一个带循环的算法,因此不要使用内置的Linq函数来查找值。你必须先学会走路,然后才能运行。这对初学者来说太高级了。这是O(3n),在数组上循环3次。我知道我对性能有一种不健康的痴迷,但我们不是都有吗?+1,这不仅很有启发性,有助于理解算法,而且也是最快的方法:O(n)这是最快的方法。建议的Linq方法在同一个数组上运行多个循环,这会降低效率,但使用现代计算机,在如此小的数组上,您不会注意到任何差异。+1明智地使用minvalue和maxvalue而不是0,因为数组中的所有数字都是negative@Jon双向飞碟-你为什么要让它成为0,我认为它们应该是开关。如果所有数字都是负数,则最大值将最终为0,这将是不正确的,而不是有额外的OR语句。currentmin默认值不应该是最大值,currentmax默认值应该是最小值吗?+1,因为您提到了通过使用框架学习编程。正在解决的问题的运行时为O(n)。所有节点都必须是che
int maxValue = Enumerable.Range(0, usageHours.Length).Max(i => usageHours[i]);
int maxPosition = Array.FindIndex(usageHours, i => i == maxValue);
int minValue = Enumerable.Range(0, usageHours.Length).Min(i => usageHours[i]);
int minPosition = Array.FindIndex(usageHours, i => i == minValue);
int indexOfMax = Enumerable.Range(0, usageHours.Length).Aggregate(
    (indexOfMax, i) => (usageHours[i] > usageHours[indexOfMax] ? i : indexOfMax)
);