获取指定范围内数组中元素计数的方法

时间:2018-01-25 07:37:37

标签: c# arrays vb.net

如果我有一个名为holder的ArrayList:{2,3,3,5,4,7,1,7,8,4}。假设我想在一定范围内找到上述数组中某个元素的出现次数,我有这些函数:

  

在VB.Net中:

Private Function getValInRange(ByVal lowerVal As Integer, ByVal upperVal As Integer, ByVal holder As ArrayList) As Integer
        Dim count As Integer = 0
        For Each item As Integer In holder
            If (item <= upperVal AndAlso item >= lowerVal) Then
                count = count + 1
            End If
        Next
        Return count
End Function
  

在C#中:

private int getValInRange(int lowerVal, int upperVal, ArrayList holder)
{
    int count = 0;
    foreach (int item in holder)
    {
        if ((item <= upperVal && item >= lowerVal))
        {
            count = count + 1;
        }
    }

    return count;
}

所以,当我查询count = getValInRange(3,5,holder)时,我会得到 5

的回报

我知道上面的函数可以满足我的需求,但我想知道是否已经有一个内置函数可以使用。我计划清理我的代码并同时学习。非常感谢...

3 个答案:

答案 0 :(得分:4)

如果您使用List<int>或任何其他IEnumerable<int>,则Linq具有Count扩展名

private int getValInRange(int lowerVal, int upperVal, List<int> holder)
{
    return holder.Count(item => item <= upperVal && item >= lowerVal);
}

编辑:正如@MarcGravell建议的那样,您也可以将ArrayList投射到IEnumerable

private int getValInRange(int lowerVal, int upperVal, ArrayList holder)
{
    return holder.Cast<int>().Count(item => item <= upperVal && item >= lowerVal);
}

答案 1 :(得分:4)

我不认为.NET Core中有这样的内置方法,但是可以使用Enumerable.Where 更简洁地编写它。

 holder.Cast<int>().Where(x => x <= upperLimit && x >= lowerLimit).Count()

ArrayList实际上已经过时了。如果您不必坚持下去,请尝试更改为List<int>。这样,您就不需要拨打Cast

 holder.Where(x => x <= upperLimit && x >= lowerLimit).Count()

可替换地,

 holder.Count(x => x <= upperLimit && x >= lowerLimit)

如果您不知道,x => ...事件被称为lambda表达式,请详细了解它们here

还有很多其他很酷的方法可以帮助您在IEnumerable<T>命名空间中处理System.Linq!这个很酷的辅助方法集合称为Language INtegrated Query (LINQ)

答案 2 :(得分:1)

我建议使用LINQ并将ArrayList更改为IEnumerable,但更优先使用IEnumerable<int>

private int GetValInRange(int lowerVal, int upperVal, IEnumerable holder)
    {
        return holder.Cast<int>().Count(item => item <= upperVal && item >= lowerVal);
    }