处理一个单词,进退两难使用字符串或字符数组或stringbuilder
本文关键字:字符串 字符 stringbuilder 数组 进退两难 单词 一个 处理 | 更新日期: 2023-09-27 18:13:32
我正在研究象棋(不是网格)。这个象棋(不是网格)有X行。
每一行有Y块。
我想知道在每一行中我能找到什么单词。还有那是什么词的开始和停止索引
所以我的策略是:
- 取行(-cat- dog----)中的所有项并保存到字符串
- 使用
for(...){...}
操作字符串的索引
这是一个好主意,或者也许我应该将字符串转换为字符数组,然后操作?
什么方法能更快地做到这一点?那么StringBuilder呢?
@Oden谢谢你的更正,但我不是说网格,只是一个象棋:)
我把这个问题写错了。(也许我提错了问题。我很难做出这个形状,所以对不起。
主要问题的问题被简单地包含在这个主题的主要标题中。
在处理单词(例如mamma--mia
)(每个元素都是ansi符号,假设是字符串格式)时,哪种方法会更快?
所以我想知道如果我只是在一个字符串上工作,它会比第一次将字符串转换为chararray和工作更快。或者使用stringBuilder。
我只是问什么更快:工作或字符,字符串或字符串生成器的元素在我的方法。
您面临的性能瓶颈不在于字符串结构,而在于找到您要查找的单词。如果要查找的单词有m个,那么最终可能要遍历字符串查找单词m次。没必要!您可以尝试创建一个巨大的正则表达式*来匹配您正在查找的所有子字符串。它们的构造方式*,它们只传递字符串一次(基本上,如果你以"a"开头,它们处于一种状态,告诉它们"这可能是所有以a开头的单词的开头",如果下一个字符是"b",状态说"这可能是一个以ab开头的单词的开头或一个以b开头的单词的开头)。
- http://www.regular-expressions.info/dotnet.html
- http://en.wikipedia.org/wiki/Finite-state_machine
我建议
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;
}
模块化获取Items
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,
};
}
}
看起来你应该使用字符串的二维数组- string[,]
或锯齿数组(取决于每一行是否有相同数量的块)。
另一个选项是使用列表的通用列表- List<List<string>>
。