Обратная Строка. Замена - Более быстрый способ сделать его?

Кажется, вы забыли заменить имена методов и переменных при копировании кода votes

$product = new Product();
$product->product_no = $request->product_no;
$product->description = $request->description;
$product->product_name = $request->$model->getProduct_name();

if (auth()->user()->votes()->save($vote))
--------------------^^^^^^^-------^^^^^--
    return response()->json([
         'success' => true,
         'data' => $product->toArray()
     ]);

Это должно быть

if (auth()->user()->products()->save($product))

Также есть другое поле ([114 ]) что вы пытаетесь сохранить, но это не заполняется.

protected $fillable =[
      'product_no','description', 'product_name'
    ];

А также, вы можете рассмотреть возможность использования одного и того же шаблона при именовании ваших переменных и методов. Вы можете сказать getProductName или get_product_name вместо getProduct_name.

7
задан esac 5 May 2009 в 23:48
поделиться

6 ответов

Хорошо, на строке ~ 60 КБ это будет выполняться примерно на 40% быстрее, чем ваша версия:

public static string ReplaceNot(this string original, char[] pattern, char replacement)
{
    int index = 0;

    StringBuilder sb = new StringBuilder(new string(replacement, original.Length));

    while ((index = original.IndexOfAny(pattern, index)) > -1)
    {
        sb[index] = original[index++];
    }

    return sb.ToString();
}

Хитрость заключается в том, чтобы инициализировать новую строку со всеми заменяющими символами, поскольку большинство из них будут заменены.

6
ответ дан 6 December 2019 в 07:28
поделиться

Я собираюсь бросить свои 2 цента, а затем посмотреть, придумает ли кто-нибудь что-нибудь более элегантное. В общем случае:

<E> List<E> cons(E e, List<E> list) {
    List<E> res = Lists.newArrayListWithCapacity(list.size() + 1);
    res.add(e);
    res.addAll(list);
    return res;
}

с ImmutableList (не знаю, насколько это эффективно): есть перегрузка, где шаблон может быть строкой char [] или ?

4
ответ дан 6 December 2019 в 07:28
поделиться

Вот еще одна версия для вас. Мои тесты показывают, что его производительность довольно хорошая.

public static string ReplaceNot(
    this string original, char[] pattern, char replacement)
{
    char[] buffer = new char[original.Length];

    for (int i = 0; i < buffer.Length; i++)
    {
        bool replace = true;

        for (int j = 0; j < pattern.Length; j++)
        {
            if (original[i] == pattern[j])
            {
                replace = false;
                break;
            }
        }

        buffer[i] = replace ? replacement : original[i];
    }

    return new string(buffer);
}
4
ответ дан 6 December 2019 в 07:28
поделиться

Разве вы не можете использовать Regex.Заменить так:

Regex regex = new Regex(@"[^.;/\\]");
string s = regex.Replace("test. stop; or, not", "*");
8
ответ дан 6 December 2019 в 07:28
поделиться

Это будет O (n). Кажется, вы заменяете все алфавиты и пробелы на * , почему бы просто не проверить, является ли текущий символ алфавитом / пробелом, и заменить его?

0
ответ дан 6 December 2019 в 07:28
поделиться

StringBuilder имеет перегрузку, которая принимает символ и число, поэтому вам не нужно создавать промежуточные строки для добавления в StringBuilder. Я получаю около 20% улучшения, заменив это:

sb.Append(new string(replacement, index - old - 1));

на:

sb.Append(replacement, index - old - 1);

и это:

sb.Append(new string(replacement, original.Length - (old + 1)));

на:

sb.Append(replacement, original.Length - (old + 1));

(я проверил код, который вы сказали, был примерно в четыре раза быстрее, и я нашел его примерно в 15 раз медленнее ...)

2
ответ дан 6 December 2019 в 07:28
поделиться
Другие вопросы по тегам:

Похожие вопросы: