比较C#中的字符串

时间:2009-11-18 02:11:25

标签: c# string compare

好的,我试图每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 个答案:

答案 0 :(得分:6)

我不是故意嗤之以鼻,但目的是什么:

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

如果你想要暂停,为什么不只是Thread.Sleep(TimeSpan.FromSeconds(1))?你的代码示例没有多大意义。

答案 1 :(得分:4)

String.Compare(string1, string2 ......)为您提供了更多选择。

请参阅MSDN上的String.Compare Method

答案 2 :(得分:3)

我认为你的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每秒检查一次网址。每当此文本文件的内容发生更改时,此代码将弹出一个新的NowPlaying窗口(我认为您正在尝试这样做),并将继续执行此操作,直到您设置_Comparing为止到false

您也可能希望每秒轮询一次频率低于每秒​​一次,在这种情况下,您可以将timer.Interval设置为10000(10秒)。

答案 3 :(得分:1)

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);
        }

    }

这个检查现在正在播放的歌曲的线程应该与主应用程序线程分开,因为它会睡觉并且您希望(我认为)您的应用程序在检查之间保持响应。

编辑:比较现在应该正常工作(未经测试)。

答案 4 :(得分:0)

我建议您使用以下内容:

  1. 生成已保存数据的哈希值并存储该值,如果不需要,则无需创建大型字符串对象...
  2. 对于所有新读取,只需生成一个哈希并将其与保存的哈希对象进行比较。
  3. 使用任何散列算法,但我建议使用shah1。
  4. 使用String类的内置String.Compare(...)方法来比较哈希对象。
  5. 尝试Thread.Sleep([millisecondsvaluehere])暂停程序执行。您还可以考虑将读取调用放在计时器,表单或系统计时器中(确保在访问UI对象之前调用)