Saya berpikir tentang menerapkan IEnumerable untuk koleksi kustom saya (pohon) sehingga saya dapat menggunakan foreach untuk melintasi pohon saya. Namun setahu saya masing-masing selalu dimulai dari koleksi elemen pertama. Saya ingin memilih dari elemen mana masing-masing dimulai. Apakah mungkin untuk mengubah elemen dari mana foreach dimulai?
c#
iterator
ienumerable
neraka
sumber
sumber
Jawaban:
Iya. Lakukan hal berikut:
Collection<string> myCollection = new Collection<string>; foreach (string curString in myCollection.Skip(3)) //Dostuff
Skip
adalah fungsi IEnumerable yang melewatkan berapa pun yang Anda tentukan mulai dari indeks saat ini. Di sisi lain, jika Anda ingin menggunakan hanya tiga pertama Anda akan menggunakan.Take
:foreach (string curString in myCollection.Take(3))
Ini bahkan dapat dipasangkan bersama, jadi jika Anda hanya menginginkan 4-6 item, Anda dapat melakukan:
foreach (string curString in myCollection.Skip(3).Take(3))
sumber
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"; }
Paling mudah menggunakan
Skip
metode di LINQ ke Objek untuk ini, untuk melewati sejumlah elemen:foreach (var value in sequence.Skip(1)) // Skips just one value { ... }
Jelas hanya mengubah 1 untuk nilai lain untuk melewati sejumlah elemen yang berbeda ...
Demikian pula Anda dapat menggunakan
Take
untuk membatasi jumlah elemen yang dikembalikan.Anda dapat membaca lebih lanjut tentang keduanya (dan yang terkait
SkipWhile
sertaTakeWhile
metode) di seri blog Edulinq saya .sumber
sequence
bisa sahnull
atau tidak. Agaknya OP dapat mengatasinya sendiri - itu bukan bagian dari pertanyaan ...Anda dapat menggunakan Enumerable.Skip untuk melewati beberapa elemen, dan memulainya dari sana.
Sebagai contoh:
foreach(item in theTree.Skip(9)) // Skips the first 9 items { // Do something
Namun, jika Anda menulis pohon, Anda mungkin ingin memberikan anggota pada item pohon itu sendiri yang akan mengembalikan baru
IEnumerable<T>
yang akan dihitung dari sana. Ini secara potensial akan lebih berguna dalam jangka panjang.sumber
IEnumerable<T> SubTree(rootIndex)
? Panggilan yang bagus!IEnumerable<MyTreeElement> Children
jadi Anda bisa melakukan:foreach(var item in someElement.Children)
- jauh lebih jelas daripada menggunakan metode ekstensi IMO.Foreach
akan mengulangi koleksi Anda dengan cara yang ditentukan oleh penerapan AndaIEnumerable
. Jadi, meskipun Anda bisa melewati elemen (seperti yang disarankan di atas), secara teknis Anda masih mengulang elemen dalam urutan yang sama.Tidak yakin apa yang ingin Anda capai, tetapi kelas Anda bisa memiliki beberapa
IEnumerable
properti, yang masing-masingnya menghitung elemen dalam urutan tertentu.sumber
Jika Anda ingin melewatkan membaca Baris dalam a
DataGridView
, coba iniforeach (DataGridViewRow row in dataGridView1.Rows.Cast<DataGridViewRow().Skip(3))
Jika Anda ingin menyalin konten dari satu
DataGridView
baris ke baris lain yang dilewati, coba ini,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; }
ini menyalin konten dari satu
DataGridView
ke lainnya dengan melewatkan 3 baris.sumber
DataGridView
sama sekali (atau bahkan kerangka UI).