Сравнить строки в C # - PullRequest
       8

Сравнить строки в C #

1 голос
/ 18 ноября 2009

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

Вот код, который у меня есть до сих пор, чтобы получить текстовый документ из Интернета и сохранить его в строку:

public String GetData(String url)
{
    WebRequest request = WebRequest.Create(url);
    HttpWebResponse response = (HttpWebResponse)request.GetResponse();
    Stream dataStream = response.GetResponseStream();
    StreamReader reader = new StreamReader(dataStream);
    String data = reader.ReadToEnd();
    reader.Close();
    dataStream.Close();
    response.Close();
    return data;
}

А вот что я пытаюсь сравнить строки.

public void CompareStrings()
{
    int x;
    x = 1;
    String data = GetData("http://xcastradio.com/stats/nowplaying.txt");
    string savedData = data;
    while (x > 0 && x < 100000001)
    {
        x++;
    }
    String data1 = GetData("http://xcastradio.com/stats/nowplaying.txt");
    NowPlayingInfo1.Text = data;
    NowPlaying np = new NowPlaying();
    if (data1 != savedData)
    {
        NowPlayingInfo1.Text = data1;
        np.Show(this);
    }
}

Ответы [ 5 ]

6 голосов
/ 18 ноября 2009

Я не хочу быть вялым, но какова цель:

    while (x > 0 && x < 100000001)
    {
        x++;
    }

Если вы хотите сделать паузу, почему бы просто не Thread.Sleep (TimeSpan.FromSeconds (1))? Ваш пример кода не имеет особого смысла.

4 голосов
/ 18 ноября 2009

String.Compare(string1, string2 ......) дает вам больше возможностей.

См. String.Compare Method в MSDN

3 голосов
/ 18 ноября 2009

Я думаю, ваш метод CompareStrings () должен выглядеть примерно так:

private bool _Comparing = false;
private string _URL = "http://xcastradio.com/stats/nowplaying.txt";
private string _data = "";
public void CompareStrings()
{
    Timer timer = new Timer();
    timer.Interval = 1000;
    timer.Tick += timer_Tick;
    _data = GetData(_URL);
    _Comparing = true;
    timer.Start();
}
void timer_Tick(object sender, EventArgs e)
{
    if (_Comparing)
    {
        string newdata = GetData(_URL);
        if (newdata != _data)
        {
            NowPlaying np = new NowPlaying();
            NowPlayingInfo1.Text = newdata;
            _data = newdata;
            np.Show(this);
        }
    }
    else
    {
        Timer timer = (Timer)sender;
        timer.Stop();
    }
}

Этот код использует Timer для проверки URL один раз в секунду. Всякий раз, когда содержимое этого текстового файла изменяется, этот код будет всплывать в новом окне NowPlaying (что, я думаю, вы пытаетесь сделать), и будет продолжать это делать, пока вы не установите _Comparing в false .

Возможно, вы также захотите опрашивать URL реже, чем раз в секунду, и в этом случае вы должны установить timer.Interval примерно на 10000 (10 секунд).

1 голос
/ 18 ноября 2009
public void CompareStrings()
    {
        String data = GetData("http://xcastradio.com/stats/nowplaying.txt");

        System.Threading.Thread.Sleep(TimeSpan.FromSeconds(15));

        String data1 = GetData("http://xcastradio.com/stats/nowplaying.txt");

        NowPlayingInfo1.Text = data;

        NowPlaying np = new NowPlaying();

        if (String.Compare(data, data1) != 0)
        {
            NowPlayingInfo1.Text = data1;
            np.Show(this);
        }

    }

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

Редактировать: сравнение теперь должно работать корректно (не проверено).

0 голосов
/ 18 ноября 2009

Я рекомендую вместо этого использовать следующее:

  1. Создайте хеш из сохраненных данных и сохраните значение, вам не нужно создавать большие строковые объекты, если вам не нужно ...
  2. Для всех новых операций чтения просто сгенерируйте хеш и сравните его с сохраненным хеш-объектом.
  3. Используйте любой алгоритм хэширования, но я бы порекомендовал использовать shah1.
  4. Используйте встроенный метод String.Compare (...) класса String для сравнения хеш-объектов.
  5. Попробуйте Thread.Sleep ([millisecondsvaluehere]), чтобы приостановить выполнение программы. Вы также можете подумать о том, чтобы поместить вызов чтения в таймер, формы или системный таймер (обязательно вызовите его перед доступом к объектам пользовательского интерфейса)
...