处理一个单词,进退两难使用字符串或字符数组或stringbuilder

本文关键字:字符串 字符 stringbuilder 数组 进退两难 单词 一个 处理 | 更新日期: 2023-09-27 18:13:32

我正在研究象棋(不是网格)。这个象棋(不是网格)有X行。
每一行有Y块。

我想知道在每一行中我能找到什么单词。还有那是什么词的开始和停止索引

所以我的策略是:

  • 取行(-cat- dog----)中的所有项并保存到字符串
  • 使用for(...){...}
  • 操作字符串的索引

这是一个好主意,或者也许我应该将字符串转换为字符数组,然后操作?

什么方法能更快地做到这一点?那么StringBuilder呢?

@Oden谢谢你的更正,但我不是说网格,只是一个象棋:)


我把这个问题写错了。(也许我提错了问题。我很难做出这个形状,所以对不起。

主要问题的问题被简单地包含在这个主题的主要标题中。
在处理单词(例如mamma--mia)(每个元素都是ansi符号,假设是字符串格式)时,哪种方法会更快?

所以我想知道如果我只是在一个字符串上工作,它会比第一次将字符串转换为chararray和工作更快。或者使用stringBuilder。

我只是问什么更快:工作或字符,字符串或字符串生成器的元素在我的方法。

处理一个单词,进退两难使用字符串或字符数组或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>>