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

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



답변

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

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))


답변

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

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

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

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

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


답변

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

예를 들면 :

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

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


답변

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

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


답변

에서 행 읽기를 건너 뛰려면 다음을 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 행을 건너 뛰고 하나 에서 다른 것으로 내용이 복사 됩니다.


답변