2016-02-13 2 views
0

Yo! Я знаю, что это практическая практика, в основном в Drupal. Прошу прощения, если это дубликат (не мог найти его в моих собственных терминах).Замена «токена» внутри файлов ресурсов C#

У меня есть серия файлов ресурсов для целей локализации. В Drupal есть что-то, называемое токенами, которые представляют собой некоторый узорный текст, который заменяется сервером при его вызове.

Пример:

файл ресурсов на английском языке:

«У меня есть эта локализация текста в моем файле ресурсов на английском языке, и я хотел бы, чтобы отобразить на $ [пользователь], как это работает»

файл ресурсов на испанском языке:

"Yo Тенго Эсте Texto localizado ан-эль Archivo де Recursos ан español у quisiera enseñarle аль $ [пользователь] Cómo Эсто funciona."

Затем, после некоторого разбора я бы заменил токен на правильные детали.

Мой нынешний подход был следующим:

public class LocalizationParser 
{ 
    private Dictionary<string, dynamic> Tokens { get; set; } 

    public LocalizationParser() 
    { 
     Tokens = new Dictionary<string, dynamic>(); 
     Tokens.Add("$[user]", HttpContext.Current.User.Identity.Name); 
    } 


    public string ParseResource(string text) 
    { 
     foreach(var token in Tokens) 
     { 
      text.Replace(token.Key, token.Value); 
     } 

     return text; 
    } 
} 

Я знаю, что у меня есть огромная проблема, что я получаю все эти ценности заселена, и там будет ненужная влияние на производительность. Я знаю, что если бы я мог вызвать метод, который мог бы получить правильное значение, только если ключ словаря был найден, в нем не было бы огромных накладных расходов.

Каков правильный способ сделать это в C#? (В настоящее время используется ASP.NET MVC 5 с EF 6.1)

+1

в цикле ParseResource, вы должны иметь 'текст = text.Replace (token.Key, token.Value)' для этой работы – Wapac

+0

Hahah. Спасибо, что ты прав! Как насчет подхода? –

+1

Я также не уверен, почему там используется динамика. Не могли бы вы объяснить, почему не ? – Wapac

ответ

2

«Преждевременная оптимизация - это корень всех злых», как говорит Кнут. Почему вы так уверены, что это повлияет на производительность?

Является ли это предположением или фактом, что вы можете создавать резервные копии с номерами, которые вы определили узким местом с профилировщиком как dotTrace? Также было бы полезно узнать, сколько же токенов вы ожидаете.

В любом случае, Замена в порядке. Вы можете использовать Hashtable и использовать метод Exists в сочетании с регулярным выражением, чтобы сначала получить токены, а затем выполнить поиск.

Просто помните, что строки неизменяемы, и поэтому каждая замена означает копия с копией, которая может быть медленной, если это делается в любое время.

Для многократной модификации строки вместо StringBuilder.

Процесс тщательно документирован: https://msdn.microsoft.com/en-us/library/2839d5h5(v=vs.110).aspx

+0

Отлично! Будет заменять его как можно скорее. –

+0

Я пошел вперед и посмотрел на Hashtables. Кажется, что словарь является обновленной версией Hashtable. «Не используйте это. Это более старый тип .NET Framework. Он медленнее, чем общий тип словаря. Но если старая программа использует Hashtable, полезно знать, как использовать этот тип." http://www.dotnetperls.com/dictionary –

+1

Да, но прочтите это: http://stackoverflow.com/questions/301371/why-is-dictionary-preferred-over-hashtable – xmorera

Смежные вопросы