カスタムコレクション(ツリー)にIEnumerableを実装して、foreachを使用してツリーをトラバースできるようにすることを考えています。ただし、私が知る限り、foreachは常にコレクションの最初の要素から始まります。foreachが開始する要素を選択したいと思います。foreachが始まる要素をどうにかして変更することは可能ですか?
カスタムコレクション(ツリー)にIEnumerableを実装して、foreachを使用してツリーをトラバースできるようにすることを考えています。ただし、私が知る限り、foreachは常にコレクションの最初の要素から始まります。foreachが開始する要素を選択したいと思います。foreachが始まる要素をどうにかして変更することは可能ですか?
回答:
はい。以下をせよ:
Collection<string> myCollection = new Collection<string>;
foreach (string curString in myCollection.Skip(3))
//Dostuff
Skip
はIEnumerable関数であり、現在のインデックスから指定した数をスキップします。一方、最初の3つだけを使用したい場合は、次を使用します.Take
。
foreach (string curString in myCollection.Take(3))
これらはペアにすることもできるので、4〜6個のアイテムだけが必要な場合は、次のことができます。
foreach (string curString in myCollection.Skip(3).Take(3))
foreach(List<string> row in rows.skip(1)){ row[0] = "newInfo"; }
vs for(int i=1; i<rows.Count;i++){ List<string> row = rows[i]; row[0] = "newStuff"; }
Skip
このためにLINQto Objectsのメソッドを使用して、指定された数の要素をスキップするのが最も簡単です。
foreach (var value in sequence.Skip(1)) // Skips just one value
{
...
}
明らかに、他の値の1を変更して、異なる数の要素をスキップします。
同様にTake
、返される要素の数を制限するために使用できます。
これらの両方(および関連するメソッドSkipWhile
とTakeWhile
メソッド)の詳細については、Edulinqブログシリーズを参照してください。
sequence
合法的にできるかどうかはわかりnull
ません。おそらく、OPはそれを自分で処理できます-それは実際には問題の一部ではありません...
Enumerable.Skipを使用できますを、一部の要素をスキップし、そこから開始。
例えば:
foreach(item in theTree.Skip(9)) // Skips the first 9 items
{
// Do something
ただし、ツリーを作成している場合は、ツリーアイテム自体にメンバーを指定して、IEnumerable<T>
そこから列挙する新しいメンバーを返すことができます。これは、潜在的に、長期的にはより有用です。
IEnumerable<T> SubTree(rootIndex)
?グッドコール!
IEnumerable<MyTreeElement> Children
ので、次のことができます 。-foreach(var item in someElement.Children)
拡張メソッドIMOを使用するよりもはるかに明確です。
の行の読み取りをスキップしたい場合はDataGridView
、これを試してください
foreach (DataGridViewRow row in dataGridView1.Rows.Cast<DataGridViewRow().Skip(3))
DataGridView
行をスキップして1つのコンテンツを別のコンテンツにコピーする場合は、これを試してください。
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;
}
これにより、DataGridView
3行をスキップしてコンテンツがコピーされます。
DataGridView
していません(またはUIフレームワークさえも)。