1)ポイントを含むオブジェクトを作成し、
2)部分をモジュール化して文字列を解析することをお勧め
します(できればクラス内ですが、メソッドでも可能です)
。3)LINQを使用して、すべての行の値を取得します。あなたが探しているコラム
例は次のとおりです。
void Main()
{
const string columnName = "ColumnYouSeek";
var dgv = GetDataGridView(columnName);
var items = GetItems(dgv, columnName);
// items now contains what you want
}
値を保持するオブジェクトを作成します
class ItemWithIndex
{
public string Text { get; set; }
public int StartIndex { get; set; }
public int EndIndex { get; set; }
public override string ToString()
{
return string.Format(
"{0}: Starts at {1}, Ends at {2}",
Text, StartIndex, EndIndex);
}
}
以下に変更して、DataGridViewをポイントします
public System.Windows.Forms.DataGridView GetDataGridView(string columnName)
{
var dgv = new System.Windows.Forms.DataGridView();
var column = new System.Windows.Forms.DataGridViewTextBoxColumn();
column.DataPropertyName = columnName;
column.Name = columnName;
dgv.Columns.Add(column);
dgv.Rows.Add("-cat--dog----");
dgv.Rows.Add("--elephant----mouse----");
return dgv;
}
アイテムを取得するためにモジュール化する
public IEnumerable<ItemWithIndex> GetItems(
System.Windows.Forms.DataGridView dgv, string columnName)
{
var rows = dgv.Rows.Cast<System.Windows.Forms.DataGridViewRow>();
var rowData = rows.Select(x => (x.Cells[columnName].Value ?? "").ToString());
return rowData.SelectMany(x => GetWords(x));
}
部分をモジュール化して個々の単語を取得します
注:これは単体テストおよびリファクタリングが可能です
public IEnumerable<ItemWithIndex> GetWords(string val)
{
var index = val.IndexOf("-");
while (index >= 0 && index + 1 < val.Length)
{
var startIndex = index + 1;
var endIndex = val.IndexOf("-", startIndex);
if (endIndex < 0)
endIndex = val.Length - 1; // end of string
var text = val.Substring(startIndex, endIndex - startIndex);
index = endIndex;
if (string.IsNullOrEmpty(text))
continue;
yield return new ItemWithIndex
{
Text = text,
StartIndex = startIndex,
EndIndex = endIndex,
};
}
}