如果我有一个名为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
我知道上面的函数可以满足我的需求,但我想知道是否已经有一个内置函数可以使用。我计划清理我的代码并同时学习。非常感谢...
答案 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);
}