你如何找到最后一个循环中的每个(VB.NET)?
题
我怎么能确定如果我是在最终循环的每个发言VB.NET?
解决方案
在一般情况下,可以在其上实现上执行For Each
集合的 IEnumerator
一>接口。这个接口只有两个方法,MoveNext
和Reset
和一个属性,Current
。
基本上,当你对集合使用For Each
,它调用MoveNext
功能,读取返回的值。如果返回值是True
,这意味着在集合中的一个有效的元素和元素通过Current
属性返回。如果有集合中没有更多的元素时,MoveNext
函数返回False
和迭代被退出。
从上面的解释,很显然的是,For Each
不跟踪当前位置的收集等的的回答你的问题是一个短期的没有的。
但是,如果你仍然希望知道,如果你在集合中的最后一个元素上,你可以试试下面的代码。它检查(使用LINQ)如果当前项是最后一个项目。
For Each item in Collection
If item Is Collection.Last Then
'do something with your last item'
End If
Next
其他提示
它可能会更容易,只需使用For循环代替的ForEach。但是,同样的,你可以保留一个计数器的ForEach循环中,看看它等于yourCollection.Count - 1
,那么你在最后一次迭代。
与foreach,你不知道这个直到为时太晚(ie。你的循环)。
注意,我假设你正在使用的东西在哪里你只能有一个综合的接口。如果你有一个清单,列,等等。然后按照其他的答案在这里,其用途。数或类似于找出如何许多的项目有,而因此,你可以跟踪你在哪里在收集。
然而,只有综合/IEnumerator,有没有办法知道到底或没有更多,如果使用foreach.
如果你需要知道这一点,使用综合自己,这是什么foreach。
以下解决方案是为C#但应该很容易地转换到VB.NET:
List<Int32> nums = new List<Int32>();
nums.Add(1);
nums.Add(2);
nums.Add(3);
IEnumerator<Int32> enumerator = nums.GetEnumerator();
if (enumerator.MoveNext())
{
// at least one value available
while (true)
{
// make a copy of it
Int32 current = enumerator.Current;
// determine if it was the last value
// if not, enumerator.Current is now the next value
if (enumerator.MoveNext())
{
Console.Out.WriteLine("not last: " + current);
}
else
{
Console.Out.WriteLine("last: " + current);
break;
}
}
}
enumerator.Dispose();
这将打印:
not last: 1
not last: 2
last: 3
关键是要采取一个复制的当前价值,然后要求枚举,试图转移到下一个。如果失败,将复制你的确是最后一个数值,否则还有更多。
简短的回答:你不能
龙答:没有什么在的语义为每个允许您确定您是否正在运行的姓氏,名字或任何特定的循环语句。
对于每一个建在了IEnumerable和IEnumerable <>接口和行为取决于你调用执行。它是有效的,但令人困惑,在收集你正在迭代以不同的顺序每次返回的元素。幸运的是,名单<>并没有这样做。
如果你真的需要知道某个特定的迭代是最后一个,你可以找出最后一个元素(提前),然后采取不同的行动,当你遇到元素。
更容易将检测的第一迭代(比方说,通过一个布尔值),然后做不同的东西。
这是实施例(C#,但VB将是相似的):
StringBuilder result = new StringBuilder();
bool firstTime = true;
foreach(string s in names)
{
if (!firstTime)
{
result.Append(", ");
}
result.Append(s);
firstTime = false;
}
检查如果元素是容器的最后一个元素。
你为什么要这么做?点击 你可以只把指令的循环之后。 (你的最后一个元素上执行)
这会更容易地使用for循环,而不是一个foreach,但你可以不喜欢
If item.Equals(itemCollection(itemCollection.Count)) Then
...
End If
您ForEach循环的内部...假设对象已经适当重写Equals方法。
这是可能比仅仅使用For循环或跟踪当前指数在一个单独的变量更加资源密集的。
我不知道这是否是正确的语法,它是因为我已经用VB很长一段时间。
使用标准的“对于每一个”循环你不能。的目的是“为每一个”循环,是让你把注意力集中在数据代替底层集合的。
我继续回来到这个职位,所以我决定坐下来思考这个问题,我本想出了:
For Each obj In myCollection
Console.WriteLine("current object: {0}", obj.ToString)
If Object.ReferenceEquals(obj, myCollection.Last()) Then
Console.WriteLine("current object is the last object")
End If
Next
您甚至可以降低If...Then...End If
语句单行,如果你想。我不知道,如果在每个迭代上呼吁.Last()
对性能有很大的影响,但你总是可以把它分配给了循环的变量外,如果那是什么让你彻夜难眠。
此代码示例可以帮助
For Each item in Collection
If ReferenceEquals(Collection.Item(Collection.Count - 1), item) Then
'do something with your last item'
End If
Next
如果你是绑IEnumerable的。你必须是foreach循环里面?如果没有,你可以只在foreach循环之前声明一个变量。在循环过程中进行设置。然后,用它在循环之后(如果其不为空)
那么有一些解决方法 假设您正在使用的CheckBoxList工作
那么这个代码示例可能有帮助:
Dim count As Integer = 0
Dim totalListCount As Integer = CheckBoxList.Items.Count()
For Each li In CheckBoxList.Items
count += 1
// This is the Last Item
If count = totalListCount THEN
// DO Somthing.....
END IF
NEXT
下面是一个简单的事情,我不知道这是否是政治上正确,但它的工作原理
for each item in listOfThings
if(item = listOfThings.last)then
'you found the last loop
end if
next