Реализация логики c при сравнении двух строк перед дальнейшей обработкой - PullRequest
0 голосов
/ 09 января 2020

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

{
urlSouce": """,
  "info": [
    {
      "id": ""
    }
]
}

Поэтому каждый раз, когда я десериализую файл, я обращаюсь к переменной и использую это значение для Запрос API. Тем не менее, я понял, что большую часть времени этот urlSource одинаков и, следовательно, продолжать посылать запрос API не требуется, и это влияет на производительность, поэтому сначала я хочу проверить, совпадает ли urlSource, поступающий из текущего десериализационного файла, с предыдущий файл.

Если это так, нет необходимости повторно отправлять запрос API. Я понимаю, что могу добавить логический флаг в эту логику c, но я не могу придумать, где лучше всего его хранить.

Чтобы продемонстрировать, что я делаю, у меня есть следующий код. Если у кого-то есть идеи относительно того, что нужно сделать, пожалуйста, помогите мне

string previousUrl;
string currentURL;
bool isValueChanged;

currentURL = "test1.com"; //the new URL populated from the deserialized JSON
previousUrl = "test2.com"; //the previously deserialized URL of the file before this

Здесь у меня нет проблем с десериализацией

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

Ответы [ 2 ]

1 голос
/ 09 января 2020

Похоже, вы хотите проверить, что строка не использовалась ранее, прежде чем обрабатывать ее.

Если это так, вы можете просто сохранить «используемые» строки в Dictionary, с строка как Key и результат обработки как Value, а затем просто проверьте, содержит ли словарь Key для каких-либо новых строк, прежде чем обрабатывать их.

Приведенный ниже метод принимает string для обработки и bool, указывающие, использовать ли кэшированный результат, если он существует. Если string не содержится в словаре, или пользователь указывает useCache = false, строка обрабатывается и сохраняется в словаре (вместе с результатом), и результат возвращается. В противном случае кешированный результат для этой строки возвращается сразу.

private readonly Dictionary<string, string> cachedResults = new Dictionary<string, string>();

public string GetApiResult(string uri, bool useCachedResult = true)
{
    // If we've already encountered this string, return the cached result right away
    if (useCachedResult && cachedResults.ContainsKey(uri)) return cachedResults[uri];

    // Process the string here
    var result = MakeAPICall(uri);

    // Save it, along with the result, in our dictionary
    cachedResults[uri] = result;

    // Return the result
    return result;
}

Похоже, я неправильно понял вопрос. Если вы только пытаетесь определить, соответствует ли новая строка последней найденной строке, это также очень просто:

private string cachedUri;
private string cachedResult;

public string GetApiResult(string uri, bool useCachedResult = true)
{
    // If we've already encountered this string, return the cached result right away
    if (useCachedResult && uri == cachedUri) return cachedResult;

    // Process the string here
    var result = MakeAPICall(uri);

    // Save it, along with the result, in our fields
    cachedUri = uri;
    cachedResult = result;

    // Return the result
    return result;
}
0 голосов
/ 09 января 2020

Я бы использовал MemoryCache (или просто Dictionary) с URL-адресом в качестве ключа и результатом ответа в качестве значения, но если обычно есть только одна переменная URL-адреса, как у вас может быть достаточно:

string previousUrl = null;
string previousValue = null;
string currentURL;
bool isValueChanged;

while (…)
{
   string result = null;
   currentURL = "test1.com"; //the new URL populated from the deserialized JSON
   if (previousUrl != currentUrl)
   {
      previousResult = GetTheData(currentUrl);
      previousUrl = currentUrl;
   }
   result = previousResult;

   // process result for currentUrl 
}
...