Pergunta

Eu converti meu Datatable para json string use o seguinte método ...

public string GetJSONString(DataTable Dt)
{
    string[] StrDc = new string[Dt.Columns.Count];
    string HeadStr = string.Empty;
    for (int i = 0; i < Dt.Columns.Count; i++)
    {
        StrDc[i] = Dt.Columns[i].Caption;
        HeadStr += "\"" + StrDc[i] + "\" : \"" + StrDc[i] + i.ToString() + "⅘" + "\",";
    }
    HeadStr = HeadStr.Substring(0, HeadStr.Length - 1);
    StringBuilder Sb = new StringBuilder();

    Sb.Append("{\"" + Dt.TableName + "\" : [");
    for (int i = 0; i < Dt.Rows.Count; i++)
    {
        string TempStr = HeadStr;
        Sb.Append("{");
        for (int j = 0; j < Dt.Columns.Count; j++)
        {
            if (Dt.Rows[i][j].ToString().Contains("'") == true)
            {
                Dt.Rows[i][j] = Dt.Rows[i][j].ToString().Replace("'", "");
            }
            TempStr = TempStr.Replace(Dt.Columns[j] + j.ToString() + "⅘", Dt.Rows[i][j].ToString());
        }
        Sb.Append(TempStr + "},");
    }
    Sb = new StringBuilder(Sb.ToString().Substring(0, Sb.ToString().Length - 1));
    Sb.Append("]}");
    return Sb.ToString();
}

Isso é justo ou ainda há margem para otimização para torná-lo executado mais rapidamente....Alguma sugestão...

Foi útil?

Solução

Antes de perguntar se você pode otimizá-lo para que ele seja executado mais rapidamente, a primeira pergunta que você precisa fazer pergunte a si mesmo é, ele funciona rápido o suficiente para mim?A otimização prematura é a maldição de todos nós (eu sei que consegui!).Você pode passar horas tentando micro-otimizar esse código, o que pode levar, por exemplo, de 20 ms para execução a 15 ms.Sim, isso seria uma redução de 25%, mas 5ms realmente valeriam 2 horas do seu tempo?Mais importante ainda, isso proporcionaria benefícios suficientes aos usuários finais para justificá-lo?

Você já pensou em usar o JsonSerializer de "Newtonsoft"?Isso pode muito bem ser "rápido o suficiente", é amplamente utilizado e, portanto, é mais provável que esteja correto no geral do que qualquer coisa que eu ou você possamos escrever na primeira vez.

Puramente do ponto de vista da legibilidade (que também pode permitir que o compilador C#/CLR melhore as coisas para você), você pode considerar alterar longos bits de concatenação de strings, como:

HeadStr += "\"" + StrDc[i] + "\" : \"" + StrDc[i] + i.ToString() + "⅘" + "\",";

Para:

HeadStr += string.Format("\"{0}\" : \"{0}{1}⅘\",", strDc[i], i);

Mas para quaisquer alterações que você fizer.Meça, enxágue, repita =)

Outras dicas

Pode haver maneiras de fazer com que seja executado mais rápido - mas você tem alguma indicação de que você precisar para executar mais rápido? Você tem um bom motivo para acreditar que este é um gargalo significativo no seu código? Nesse caso, compare o código com alguns dados reais e perfil da rotina para descobrir para onde está indo o tempo.

O caractere * Wildcard é suportado apenas para correspondência do prefixo, "selvagem *" não "* * cartão".Eu sugeriria que você expanda sua abordagem para marcar seus documentos.Eu sugiro que você use os metadados do SharePoint para marcar seus documentos em vez de apenas criar um título.Por exemplo, adicione um campo para documento, produto, variante, suplemento, id, publicado e idioma.Se você usar colunas do site no SharePoint 2013, eles serão convertidos em propriedades gerenciadas para você e, em seguida, poderá realizar uma pesquisa usando KQL ou Refinamento.

Por exemplo: Produto: "Superthing2000" Variante: "B" ID="13580" PublishedDate> 08/01/2011

Existem várias maneiras de automatizar a extração dos dados, um receptor de evento pode ser o Writte para resolver isso com muita facilidade.

Por que você acha que precisa de otimização? É realmente lento em alguns dados de dados? Eu apenas seriam serializando o Datatable com algo como o Newton JSON Serializer, se for serializável.

Refattor Seu código, use uma ferramenta como o Resharper, JustCode etc. para arrumar um pouco. Extraia métodos e use testes individuais (desenvolvimento de teste de teste) para encontrar gargalos no seu código e depois ajustá-los.

Mas seu primeiro passo deve ser: Refator!

O problema com o código não é velocidade, mas que não está limpo. Eu fiz alguma limpeza, mas você provavelmente poderia fazer ainda mais:

public string GetJSONString2(DataTable table)
{
    StringBuilder headStrBuilder = new StringBuilder(table.Columns.Count * 5); //pre-allocate some space, default is 16 bytes
    for (int i = 0; i < table.Columns.Count; i++)
    {
        headStrBuilder.AppendFormat("\"{0}\" : \"{0}{1}¾\",", table.Columns[i].Caption, i);
    }
    headStrBuilder.Remove(headStrBuilder.Length - 1, 1); // trim away last ,

    StringBuilder sb = new StringBuilder(table.Rows.Count * 5); //pre-allocate some space
    sb.Append("{\"");
    sb.Append(table.TableName);
    sb.Append("\" : [");
    for (int i = 0; i < table.Rows.Count; i++)
    {
        string tempStr = headStrBuilder.ToString();
        sb.Append("{");
        for (int j = 0; j < table.Columns.Count; j++)
        {
            table.Rows[i][j] = table.Rows[i][j].ToString().Replace("'", "");
            tempStr = tempStr.Replace(table.Columns[j] + j.ToString() + "¾", table.Rows[i][j].ToString());
        }
        sb.Append(tempStr + "},");
    }
    sb.Remove(sb.Length - 1, 1); // trim last ,
    sb.Append("]}");
    return sb.ToString();
}

Eu sugeriria uma solução diferente, se você estiver usando .NET 3.0 ou 3.5

em vez de fazer isso

  1. Converter datatable em xml
  2. Use XMLSerializer para converter o XML em seu objeto de domínio
  3. Usando javascriptSserializer (System.web.extensions.dll) para serializar o objeto de domínio para a String JSON.
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top