如何检查线条是否相同?

时间:2014-02-13 16:37:53

标签: c# winforms

private bool displayed;
private void PostMessage()
{
    for (int i = 0; i < ScrollLabel._lines.Length; i++)
    {
        for (int x = 0; x < WordsList.words.Length; x++)
        {
            if (ScrollLabel._lines[i].Contains(WordsList.words[x]) && !displayed)
            {
                displayed = true;
                lineToPost = ScrollLabel._lines[i];
                PostFacebookWall(LongaccessToken, lineToPost + Environment.NewLine + Environment.NewLine + "נשלח באופן אוטומטי כניסיון דרך תוכנה");
            }
        }
    }
}
  1. 我每秒都会在计时器刻度事件中调用此方法。

    • 但如果变量字符串lineToPost相同,则不会再次发送它。 但可能是lineToPost可能包含完全相同的单词,但整条线不一样,所以我想发送它。

    • 只有整行都相同,才能制作postFacebookWall

    • 如果整行不相同,但同一个单词是与其他行相同的行,则使用PostFacebookWall方法。

  2. 我正在使用bool变量,因此它不会一遍又一遍地发送相同的行。

    • 我希望一次发送一行,无论是否只有一行或者有多行。
  3. 问题是我现在使用bool的方式,它会发送一行,然后根本不会发送任何其他行。

3 个答案:

答案 0 :(得分:1)

假设我理解了您的问题,您可以存储已发送的行以检测没有更改。

// key: line index, value: sent line 
private Dictionary<int, string> sent = new Dictionary<int, string>();

private void PostMessage()
{
   for (int i = 0; i < ScrollLabel._lines.Length; i++)
    {
        var line = ScrollLabel._lines[i];

        if(sent.ContainsKey(i) && sent[i] == line) continue;

        sent[i] = line;

        if (WordsList.Any(line.Contains))                           
          PostFacebookWall(LongaccessToken, line + Environment.NewLine + Environment.NewLine 
                                                 + "נשלח באופן אוטומטי כניסיון דרך תוכנה");
    }
}

答案 1 :(得分:0)

也许我会监督某些事情,但我只记得字符串变量中的最后一行,如果当前行与最后一行不同,则只执行内部for循环。

答案 2 :(得分:0)

这似乎非常适合Reactive Extensions。使用Rx,您可以将线的推送与实际的发送操作分离。

你可能会有一个暴露IObservable<Line>的类和另一个负责发送的类。在发件人中,您将订阅observable,声明只有当新行与最后一行不同时才需要新行。您可以使用DistinctUntilChanged

Rx是一个复杂的框架,可以理解。如果这是某种玩具示例并且您不了解Rx,我可能会保留其他一个已发布的解决方案。如果这是一个更严肃/专业的工作,我会彻底考虑这个方法,因为它很多更优雅,更容易实现和维护。