문제

VB.NET에서 For Each 문의 마지막 루프에 있는지 어떻게 확인할 수 있습니까?

도움이 되었습니까?

해결책

일반적으로 수행 할 수있는 컬렉션 For Each 구현에 IEnumerator 상호 작용. 이 인터페이스에는 두 가지 방법 만 있습니다. MoveNext 그리고 Reset 그리고 하나의 속성, Current.

기본적으로 a 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

다른 팁

foreach 대신 루프를 사용하는 것이 더 쉬울 것입니다. 그러나 마찬가지로, 당신은 foreach 루프 내부에 카운터를 유지하고 그와 동등한 지 확인할 수 있습니다. yourCollection.Count - 1, 당신은 마지막 반복에 있습니다.

foreach를 사용하면 너무 늦을 때까지 이를 알 수 없습니다(예:당신은 루프에서 벗어났습니다.)

IEnumerable 인터페이스만 있는 것을 사용하고 있다고 가정합니다.목록, 배열 등이 있는 경우그런 다음 여기에서 .Count 또는 유사한 항목을 사용하여 항목 수를 확인하는 다른 답변을 따라가면 컬렉션에서 현재 위치를 추적할 수 있습니다.

그러나 IEnumerable/IEnumerator만으로는 foreach를 사용하는 경우 더 있는지 여부를 확실히 알 수 있는 방법이 없습니다.

이를 알아야 하는 경우 foreach가 수행하는 작업인 IEnumerable을 직접 사용하세요.

아래 솔루션은 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 <> 인터페이스에 내장되어 있으며 동작은 호출하는 구현에 따라 다릅니다. 혼란 스럽지만 컬렉션의 경우 매번 다른 순서로 요소를 반환하기 위해 반복하는 것이 유효합니다. 다행스럽게도 List <>은 이것을하지 않습니다.

특정 반복이 마지막이라는 것을 실제로 알아야한다면 마지막 요소를 식별 한 다음 해당 요소를 만나면 다른 조치를 취할 수 있습니다.

더 쉬운 첫 번째 반복 (예 : 부울을 통해)과 다른 일을합니다.

예제 (C#이지만 VB는 비슷합니다) :

StringBuilder result = new StringBuilder();
bool firstTime = true;
foreach(string s in names)
{
    if (!firstTime)
    {
        result.Append(", ");
    }

    result.Append(s);
    firstTime = false;
}

요소가 컨테이너의 마지막 요소인지 확인하십시오.

왜 그렇게하고 싶니?
루프 후 지침을 배치 할 수 있습니다. (마지막 요소에서 실행 한)

foreach 대신 루프를 사용하는 것이 더 쉬울 것이지만, 당신은 같은 일을 할 수 있습니다.

If item.Equals(itemCollection(itemCollection.Count)) Then
    ...
End If

Foreach 루프 내부 ... 객체가 Equals 메소드를 제대로 재정의했다고 가정합니다.

이것은 단지 루프를 사용하거나 별도의 변수로 현재 색인을 추적하는 것보다 훨씬 더 많은 리소스 집약적 일 것입니다.

이것이 올바른 구문인지 확실하지 않습니다. 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 루프 직전에 변수를 선언 할 수 있습니다. 루프 중에 설정하십시오. 그런 다음 루프 후 사용하십시오 (NULL이 아닌 경우)

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 
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top