Zastanawiam się nad zaimplementowaniem IEnumerable dla mojej kolekcji niestandardowej (drzewa), aby móc używać foreach do przechodzenia po moim drzewie. Jednak z tego co wiem, zawsze zaczyna się od pierwszego elementu kolekcji. Chciałbym wybrać, od którego elementu każdy zaczyna się. Czy da się jakoś zmienić element, od którego każdy zaczyna?
c#
iterator
ienumerable
piekło
źródło
źródło
Odpowiedzi:
Tak. Wykonaj następujące czynności:
Collection<string> myCollection = new Collection<string>; foreach (string curString in myCollection.Skip(3)) //Dostuff
Skip
jest funkcją IEnumerable, która pomija dowolną liczbę określoną, zaczynając od bieżącego indeksu. Z drugiej strony, gdybyś chciał użyć tylko pierwszych trzech, użyłbyś.Take
:foreach (string curString in myCollection.Take(3))
Można je nawet łączyć ze sobą, więc jeśli chcesz tylko 4-6 elementów, które możesz zrobić:
foreach (string curString in myCollection.Skip(3).Take(3))
źródło
foreach(List<string> row in rows.skip(1)){ row[0] = "newInfo"; }
vsfor(int i=1; i<rows.Count;i++){ List<string> row = rows[i]; row[0] = "newStuff"; }
Najłatwiej jest użyć do tego
Skip
metody w LINQ to Objects, aby pominąć określoną liczbę elementów:foreach (var value in sequence.Skip(1)) // Skips just one value { ... }
Oczywiście po prostu zmień 1 dla dowolnej innej wartości, aby pominąć inną liczbę elementów ...
Podobnie możesz użyć,
Take
aby ograniczyć liczbę zwracanych elementów.Możesz przeczytać więcej na temat obu tych metod (oraz powiązanych
SkipWhile
iTakeWhile
metod) w mojej serii blogów Edulinq .źródło
sequence
może to być uzasadnione,null
czy nie. Prawdopodobnie OP sam sobie z tym poradzi - to nie jest tak naprawdę część pytania ...Możesz użyć Enumerable.Skip, aby pominąć niektóre elementy i zacząć od tego.
Na przykład:
foreach(item in theTree.Skip(9)) // Skips the first 9 items { // Do something
Jednakże, jeśli piszesz drzewo, możesz chcieć zapewnić element członkowski w samym elemencie drzewa, który zwróci nowy,
IEnumerable<T>
który wyliczy stamtąd. Potencjalnie byłoby to bardziej przydatne w dłuższej perspektywie.źródło
IEnumerable<T> SubTree(rootIndex)
? Dobra decyzja!IEnumerable<MyTreeElement> Children
więc możesz po prostu zrobić:foreach(var item in someElement.Children)
- znacznie bardziej przejrzyste niż użycie metod rozszerzających IMO.Foreach
będzie iterować Twoją kolekcję w sposób zdefiniowany przez Twoją implementacjęIEnumerable
. Tak więc, chociaż możesz pomijać elementy (jak zasugerowano powyżej), nadal technicznie iterujesz po elementach w tej samej kolejności.Nie jestem pewien, co próbujesz osiągnąć, ale Twoja klasa może mieć wiele
IEnumerable
właściwości, z których każda wylicza elementy w określonej kolejności.źródło
Jeśli chcesz pominąć czytanie wierszy w a
DataGridView
, spróbuj tegoforeach (DataGridViewRow row in dataGridView1.Rows.Cast<DataGridViewRow().Skip(3))
Jeśli chcesz skopiować zawartość jednej
DataGridView
do drugiej, pomijając wiersze, spróbuj tego,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; }
kopiuje zawartość z jednego
DataGridView
do drugiego pomijając 3 wiersze.źródło
DataGridView
(ani nawet o frameworku interfejsu użytkownika).