foreach를 사용하는 첫 번째 요소가 아닌 다른 요소에서 반복을 시작할 수 있습니까?


89

내 사용자 지정 컬렉션 (트리)에 대해 IEnumerable을 구현하여 foreach를 사용하여 트리를 순회 할 수 있도록 생각하고 있습니다. 그러나 내가 아는 한 foreach는 항상 컬렉션의 첫 번째 요소에서 시작됩니다. foreach가 시작되는 요소를 선택하고 싶습니다. foreach가 시작되는 요소를 어떻게 든 변경할 수 있습니까?


1
: 나는 적어도 경악의 원칙을 따를 것입니다 en.wikipedia.org/wiki/Principle_of_least_astonishment
ChaosPandion

첫 번째 요소에서 시작하지 않는 경우 반복기의 동작을 어떻게 정의합니까? 시퀀스 끝에 도달하면 어떻게됩니까? 그런 다음 첫 번째 요소로 돌아가 나머지 요소를 반복합니까?
Dan J

@ChaosPandion의 의견은 내가 그 질문으로 가고 있던 곳입니다. :)
Dan J

답변:


165

예. 다음을 수행하십시오.

Collection<string> myCollection = new Collection<string>;

foreach (string curString in myCollection.Skip(3))
    //Dostuff

Skip현재 인덱스에서 시작하여 지정한 개수만큼 건너 뛰는 IEnumerable 함수입니다. 반면에 처음 세 개만 사용하려면 .Take다음 을 사용하십시오 .

foreach (string curString in myCollection.Take(3))

이것들은 함께 쌍을 이룰 수도 있으므로 4-6 개의 항목 만 원하면 다음을 수행 할 수 있습니다.

foreach (string curString in myCollection.Skip(3).Take(3))

좋은 전화. WTB의 자동 완성 유래의 (gahh 그것의 진짜 이름을 기억할 수))
MoarCodePlz

이것은 실제로 건너 뛰거나 단지 복사본을 생성합니까? IE는이 두 가지 서로 다른 것 : foreach(List<string> row in rows.skip(1)){ row[0] = "newInfo"; }for(int i=1; i<rows.Count;i++){ List<string> row = rows[i]; row[0] = "newStuff"; }
TigerBear

25

이를 위해 SkipLINQ to Objects 의 메서드 를 사용하여 주어진 요소 수를 건너 뛰는 것이 가장 쉽습니다 .

foreach (var value in sequence.Skip(1)) // Skips just one value
{
    ...
}

다른 수의 요소를 건너 뛰려면 다른 값에 대해 1을 변경하십시오.

마찬가지로 Take반환되는 요소의 수를 제한하는 데 사용할 수 있습니다 .

Edulinq 블로그 시리즈에서이 두 가지 (및 관련 SkipWhileTakeWhile방법)에 대해 자세히 알아볼 수 있습니다 .


Jon, "sequence"가 Null이면 예외가 발생하지 않습니까?
WEFX

@WEFX : 우리는 sequence합법적으로 null그럴 수 있는지 여부 를 모릅니다 . 이 ... 정말 문제의 일부가 아니다 - 아마도 영업 이익은 스스로 것을 처리 할 수
존 소총을

5

Enumerable.Skip 을 사용 하여 일부 요소를 건너 뛰고 거기서 시작하도록 할 수 있습니다 .

예를 들면 :

foreach(item in theTree.Skip(9))  // Skips the first 9 items
{
    // Do something

그러나 트리를 작성하는 경우 트리 항목 자체에 멤버를 제공하여 IEnumerable<T>거기에서 열거 할 새 항목을 반환 할 수 있습니다. 이것은 잠재적으로 장기적으로 더 유용 할 것입니다.


같은 뭔가 IEnumerable<T> SubTree(rootIndex)? 좋은 전화!
Dan J

답변 주셔서 감사합니다. skip은 유망 해 보입니다. skip에 대한 MSDN 정보를 읽고 IEnumerable <MyTree>의 확장 메소드가 될 StartFrom (this IEnumerable <MyTree> tree, MyTreeElement element) 메소드를 작성할 수 있다는 결론에 도달했습니다. 반복을 시작해야하는 IEnumerable <MyTreeElement>를 반환합니다. 그런 다음이 메서드를 foreach (var element in tree.StartFrom (someElement)))로 사용할 수 있습니다.
inferno

@inferno : 예, 쉽게 할 수 있습니다. 그러나 MyTreeElement에 다음과 같은 메서드 / 속성을 추가 IEnumerable<MyTreeElement> Children할 수 있으므로 다음 과 같이 할 수 있습니다.- foreach(var item in someElement.Children)확장 메서드 IMO를 사용하는 것보다 훨씬 더 명확합니다.
Reed Copsey 2011 년

-1

Foreach구현에 의해 정의 된 방식으로 컬렉션을 반복합니다 IEnumerable. 따라서 요소를 건너 뛸 수 있지만 (위에서 제안한대로) 여전히 기술적으로 동일한 순서로 요소를 반복합니다.

달성하려는 것이 확실하지 않지만 클래스에는 여러 IEnumerable속성이 있을 수 있으며 각 속성은 특정 순서로 요소를 열거합니다.


-1

에서 행 읽기를 건너 뛰려면 다음을 DataGridView시도하십시오.

foreach (DataGridViewRow row in dataGridView1.Rows.Cast<DataGridViewRow().Skip(3))

DataGridView행을 건너 뛰는 다른 내용을 복사하려면 다음을 시도하십시오.

foreach (DataGridViewRow row in dataGridView1.Rows.Cast<DataGridViewRow>().Skip(3))
{
    foreach (DataGridViewCell cell in row.Cells)
    {
        string value = cell.Value.ToString();
        dataGridView2.Rows[i].Cells[j].Value = cell.Value.ToString();
        j++;
    }
    i++;
    j = 0;
}

이렇게하면 DataGridView3 행을 건너 뛰고 하나 에서 다른 것으로 내용이 복사 됩니다.


이것은 질문에 대한 대답이 아닙니다. 질문은 전혀 언급되지 않습니다 DataGridView(또는 심지어 UI 프레임 워크).
NightOwl888

@ NightOwl888 질문이 일부 반복을 건너 뛰고 foreach 루프에서 반복하는 것에 관한 것이기 때문에 답변되었습니다. 내 예제에서는 방금 Skip ()을 사용하여 DataGridView에 적용했습니다.
Juned Khan Momin
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.