programing

각각의 경우(VB.NET)에서 마지막 루프를 어떻게 찾습니까?

abcjava 2023. 5. 26. 20:22
반응형

각각의 경우(VB.NET)에서 마지막 루프를 어떻게 찾습니까?

VB.NET의 For Each 문의 마지막 루프에 있는지 확인하려면 어떻게 해야 합니까?

일반적으로 할 수 있는 모음집입니다. 인행컬션렉을 수 있는 입니다.For Each인터페이스를 구현할 때.이 인터페이스에는 두 가지 방법만 있습니다.MoveNext그리고.Reset 한 리고한재산그,,▁property산재▁and한▁one,Current.

▁a를 때.For Each컬렉션에서, 그것은 그것을 부릅니다.MoveNext함수를 사용하여 반환된 값을 읽습니다.이 반되는값같경은우인 True이는 컬렉션에 유효한 요소가 있고 요소가 다음을 통해 반환됨을 의미합니다.Current소물유. 에 더 컬에더요없으이면가소상렉,MoveNext는 함수반을 반환합니다.False반복이 종료됩니다.

같은 설명으로 위의설명한, 백것은터부로으명▁from명,것,For Each컬렉션의 현재 위치를 추적하지 않으므로 질문에 대한 대답짧게 "아니오"입니다.

그러나 컬렉션의 마지막 요소에 있는지 여부를 여전히 알고 싶다면 다음 코드를 사용할 수 있습니다.현재 항목이 마지막 항목인지 확인합니다(LINQ 사용).

For Each item in Collection
    If item Is Collection.Last Then
        'do something with your last item'
    End If
Next

컬렉션을 호출하면 전체 컬렉션이 열거됩니다.따라서 전화를 거는 것은 권장되지 않습니다.Last()다음 유형의 컬렉션에서.

  • 스트리밍 컬렉션
  • 계산 비용이 많이 드는 컬렉션
  • 돌연변이 경향이 높은 컬렉션

이러한 컬렉션의 경우 직접 항목을 추적할 수 있도록 (함수를 통해) 컬렉션에 대한 열거자를 가져오는 것이 좋습니다.다음은 항목의 인덱스를 생성하는 확장 방법을 통한 샘플 구현과 현재 항목이 컬렉션의 첫 번째 항목인지 마지막 항목인지 여부입니다.

<Extension()>
Public Iterator Function EnumerateEx(Of T)(collection As IEnumerable(Of T))
    As IEnumerable(Of (value As T, index As Integer, isFirst As Boolean, isLast As Boolean))

    Using e = collection.GetEnumerator()
        Dim index = -1
        Dim toYield As T

        If e.MoveNext() Then
            index += 1
            toYield = e.Current
        End If

        While e.MoveNext()
            Yield (toYield, index, index = 0, False)
            index += 1
            toYield = e.Current
        End While

        Yield (toYield, index, index = 0, True)
    End Using
End Function

다음은 사용 예입니다.

Sub Main()
    Console.WriteLine("Index   Value   IsFirst   IsLast")
    Console.WriteLine("-----   -----   -------   ------")

    Dim fibonacci = {0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89}

    For Each i In fibonacci.EnumerateEx()
        Console.WriteLine(String.Join("   ", $"{i.index,5}",
                                             $"{i.value,5}",
                                             $"{i.isFirst,-7}",
                                             $"{i.isLast,-6}"))
    Next

    Console.ReadLine()
End Sub

산출량

인덱스 값이 먼저이고 마지막입니다.-----   -----   -------   ------00 참 거짓11 거짓21 거짓32 거짓43 거짓55 거짓68 거짓713 거짓821 거짓934 거짓1055 거짓1189 거짓 참

ForEach 대신 For 루프를 사용하는 것이 더 쉬울 것입니다. 안에 카운터를 이 ForEach와 할 수 있습니다.yourCollection.Count - 1그러면 당신은 마지막 반복에 있습니다.

포어가 있으면 너무 늦을 때까지 이를 알 수 없습니다(즉,당신은 루프에서 벗어났습니다.)

IE 숫자 인터페이스만 있는 곳에서 사용하는 것으로 가정합니다.목록, 배열 등이 있는 경우 를 사용하는 다른 답변을 따르십시오.개수 또는 유사 항목을 세어 컬렉션의 위치를 추적할 수 있습니다.

하지만, 단지 IEnumberable로/I 수치, 각각을 사용하면 더 있는지 없는지 확실히 알 수 있는 방법이 없습니다.

이 정보를 알아야 할 경우 IEnumberable을 직접 사용하십시오. 이는 각 사용자가 수행하는 작업입니다.

아래 솔루션은 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

이 방법은 현재 값의 복사본을 가져온 다음 열거자에게 다음 값으로 이동하도록 요청하는 것입니다.만약 그것이 실패한다면, 당신이 만든 복사본은 정말 마지막 값이었고, 그렇지 않으면 더 많은 것이 있습니다.

여기 간단한 것이 있습니다. 저는 그것이 정치적으로 옳은지는 모르지만 효과가 있습니다.

for each item in listOfThings
   if(item = listOfThings.last)then 
       'you found the last loop
   end if
next 

단답:그럴수는 없어요.

긴 답변:For Each 문의 의미론에는 처음, 마지막 또는 특정 반복 중 어느 것을 실행 중인지 식별할 수 있는 내용이 없습니다.

For Each는 IEnumberable 및 IEnumberable <> 인터페이스에 내장되어 있으며, 동작은 호출하는 구현에 따라 달라집니다.매번 다른 순서로 요소를 반환하기 위해 반복하는 컬렉션에 대해서는 혼란스럽긴 하지만 유효합니다.다행히 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 대신 For 루프를 사용하는 것이 더 쉬울 수 있지만 다음과 같은 작업을 수행할 수 있습니다.

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

For Each 루프 내부...개체가 Equals 메서드를 제대로 재정의했다고 가정합니다.

이는 For 루프를 사용하거나 현재 인덱스를 별도의 변수로 추적하는 것보다 훨씬 리소스를 많이 사용할 수 있습니다.

이것이 올바른 구문인지 잘 모르겠습니다. VB를 사용한 지 오래되었습니다.

표준 "For Each" 루프를 사용하면 할 수 없습니다.각 루프의 목적은 기본 컬렉션 대신 데이터에 집중할 수 있도록 하는 것입니다.

저는 계속해서 이 자리에 올라와서 앉아서 이 문제에 대해 생각하기로 결정했고 다음과 같은 생각을 하게 되었습니다.

    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

만약 당신이 IE numberable에 묶여 있다면.당신은 각 루프마다 안쪽에 있어야 합니까?그렇지 않은 경우 각 루프의 직전에 변수를 선언할 수 있습니다.루프 중에 설정합니다.그런 다음 루프 뒤에 사용합니다(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 xObj In xColl
    If xObj = xColl(xColl.Count) Then ...
Next

언급URL : https://stackoverflow.com/questions/376437/how-do-you-find-the-last-loop-in-a-for-each-vb-net

반응형