2

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

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

所以我的一排策略是:

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

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

什么方法可以更快地做到这一点?StringBuilder 呢?

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


我在某个地方写错了这个问题。(也许我错误地提出了这个问题。很难为我制作这个形状,很抱歉。)

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

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

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

4

3 回答 3

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,
                        };
    }
}
于 2011-11-05T20:17:19.393 回答
2

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

于 2011-11-06T11:26:56.347 回答
0

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

另一种选择是使用列表的通用列表 - List<List<string>>

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

于 2011-11-05T16:43:38.657 回答