【问题标题】:Working on one word, dilemma using string or char array or stringbuilder?处理一个单词,使用字符串或字符数组或字符串生成器的困境?
【发布时间】:2011-11-05 16:35:21
【问题描述】:

我正在研究国际象棋(不是网格)。这个chess(不是网格)有 X 行。
在每一行中,我们有 Y 个块。

我想知道我可以在每一行中找到哪些单词。 还有什么是单词开始和停止索引。

所以我的一排策略是:

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

这是个好主意还是我应该将该字符串转换为char数组然后操作?

什么方法更快? StringBuilder 呢?

@Oden thx 进行更正,但我的意思不是网格,而只是 国际象棋 :)


我在某个地方写错了这个问题。 (也许我的问题表述有误。我很难做出这个形状,很抱歉。)

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

所以我想知道我是否只处理一个字符串,它会比首先将字符串转换为CharArray 然后再工作要快。或者也许使用 stringBuilder。

我只是问什么更快:我的方法中的工作或字符、字符串或字符串生成器的元素.. :( 在大函数/方法中什么会更快 -> 这就是问题所在。

【问题讨论】:

  • 如果您在这里澄清“国际象棋”的含义,也许会有所帮助,以使可能知道其他术语的读者受益。
  • +1 用于解释国际象棋。而且,如果您的意思是棋盘,我猜您会这样做,那么您的意思与网格有什么区别?
  • chess 表示按行排列 ansi 元素 - 但不是 grid 表示 gridview
  • 不是物理的,是抽象的象棋

标签: c# performance algorithm words


【解决方案1】:

您面临的性能瓶颈不在于字符串构造,而在于找到您要查找的单词。如果您有 m 个要查找的单词,您最终可能会通过字符串查找单词 m 次。那没必要!您可以尝试创建一个巨大的正则表达式 * 匹配您正在寻找的所有子字符串。它们的构造方式*,它们只传递一次字符串(基本上,如果你以'a'开头,它们处于告诉他们“这可能是所有以a开头的单词的开头”的状态,如果下一个字符是 'b',state 表示“这可能是一个以 ab 开头的单词的开头,也可以是一个以 b 开头的单词的开头)。

【讨论】:

    【解决方案2】:

    我建议
    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,
                            };
        }
    }
    

    【讨论】:

    • 谢谢,但在纠正我的问题时出现了误解。当我第一次写“国际象棋”时,我的意思是国际象棋不是网格或数据网格,而是 +1 开始
    【解决方案3】:

    看起来您应该使用二维字符串数组 - string[,] 或锯齿状数组(取决于每行是否具有相同数量的块)。

    另一种选择是使用通用列表列表 - List&lt;List&lt;string&gt;&gt;。

    任何一个选项都可以让您直接按索引查询数据。

    【讨论】:

    • 但是 string 和 char 或 stribuilder 的性能列表呢?你能谈谈性能 char 数组 vs.string 吗?
    • @Cooldown4seconds - 对于您正在做的事情,它们似乎是错误的选择。 char 级别太低,与StringBuilder 无关。
    猜你喜欢
    • 1970-01-01
    • 2020-10-29
    • 1970-01-01
    • 2018-11-07
    • 1970-01-01
    • 2011-10-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多