Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 方法获取指定范围内数组中元素的计数_C#_Arrays_Vb.net - Fatal编程技术网

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

C# 方法获取指定范围内数组中元素的计数,c#,arrays,vb.net,C#,Arrays,Vb.net,如果我有一个名为holder的数组列表:{2,3,3,5,4,7,1,7,8,4}。假设我想在一定范围内找到上述数组中某个元素的出现次数,我有以下函数: 在VB.Net中: 私有函数getValInRange(ByVal lowerVal为整数,ByVal upperVal为整数,ByVal holder为数组列表)为整数 Dim计数为整数=0 每个项目在holder中为整数 如果(项目=lowerVal),则 计数=计数+1 如果结束 下一个 返回计数 端函数 在C#中: private i

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

在VB.Net中:

私有函数getValInRange(ByVal lowerVal为整数,ByVal upperVal为整数,ByVal holder为数组列表)为整数
Dim计数为整数=0
每个项目在holder中为整数
如果(项目=lowerVal),则
计数=计数+1
如果结束
下一个
返回计数
端函数
在C#中:

private int getValInRange(int-lowerVal、int-upperVal、ArrayList-holder)
{
整数计数=0;
foreach(持有人中的int项目)
{
如果((项目=lowerVal))
{
计数=计数+1;
}
}
返回计数;
}
因此,当我查询
count=getValInRange(3,5,holder)
时,我将得到5的返回值

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

如果您使用
列表
,或任何其他
IEnumerable
,Linq具有
计数
扩展名

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

我认为.NETCore中没有这样的内置方法,但您可以使用
Enumerable.Where
更简洁地编写此方法

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

 holder.Count(x => x <= upperLimit && x >= lowerLimit)
holder.Count(x=>x=lowerLimit)
如果您不知道,
x=>…
被称为lambda表达式,请进一步了解它们


System.Linq
名称空间中,还有许多其他很酷的方法可以帮助您处理
IEnumerable
!这个很酷的助手方法集合被调用。

我建议使用LINQ并将
ArrayList
更改为
IEnumerable
,但是使用
IEnumerable
更可取

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

您必须使用非通用的
数组列表吗?自2005年以来,这已经有些过时了。如果您可以使用
IEnumerable
(例如
List
int[]
)的一些实现,它会简单得多。我还建议遵循.NET命名约定-例如,我会调用方法
CountValuesInRange
。@Jon Skeet我一直在使用ArrayList。但您建议使用不同的实现是好的。也许我应该从下一次尝试开始使用它。无论如何,我不希望有一个单独的方法
CountValuesInRange
“我一直在使用ArrayList”-如果我是你,我会停止这样做。我不会等了,我现在就要学习普通收藏。@JonSkeet谢谢你的建议,伙计。我学到了一些新的东西,注意你仍然可以在
ArrayList
中使用它,但是你需要使用
.Cast().Count(…)
-虽然我同意离开
ArrayList
是非常可取的,但是如果你把lambda放在
Count
中并删除
Where
OP也要求VB,你可以把它写得更短,所以
holder.Sum(函数(x)如果(x>=lowerVal,并且当前不幸地使用了ArrayList
 holder.Cast<int>().Where(x => x <= upperLimit && x >= lowerLimit).Count()
 holder.Where(x => x <= upperLimit && x >= lowerLimit).Count()
 holder.Count(x => x <= upperLimit && x >= lowerLimit)
private int GetValInRange(int lowerVal, int upperVal, IEnumerable holder)
    {
        return holder.Cast<int>().Count(item => item <= upperVal && item >= lowerVal);
    }