C# 如何检查行是否相同? private bool显示; 私有void PostMessage() { 对于(int i=0;i

C# 如何检查行是否相同? private bool显示; 私有void PostMessage() { 对于(int i=0;i,c#,winforms,C#,Winforms,我每秒在计时器滴答声事件中调用此方法 但如果变量字符串lineToPost相同,则不会再次发送。 但是可能是这样一种情况,lineToPost中可能包含完全相同的单词,但整行内容不相同,因此我想发送它 只有当整行内容相同时,才不要使用postFacebookWall 如果整行与其他行不同,但同一单词是同一行,则使用PostFacebookWall方法 我使用的是bool变量,因此它不会一次又一次地发送同一行 我希望它发送一次(s)线,无论是否只有一条线或如果有多条线 问题是我现在使用bo

我每秒在计时器滴答声事件中调用此方法

  • 但如果变量字符串
    lineToPost
    相同,则不会再次发送。 但是可能是这样一种情况,
    lineToPost
    中可能包含完全相同的单词,但整行内容不相同,因此我想发送它

  • 只有当整行内容相同时,才不要使用
    postFacebookWall

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

  • 我使用的是
    bool
    变量,因此它不会一次又一次地发送同一行

    • 我希望它发送一次(s)线,无论是否只有一条线或如果有多条线

  • 问题是我现在使用
    bool
    的方式,它会发送一行,然后再也不会发送任何其他行

    也许我监督了一些事情,但我只会记住字符串变量中的最后一行,并且只有当当前行与最后一行不同时才执行内部for循环。

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

    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 + "נשלח באופן אוטומטי כניסיון דרך תוכנה");
                }
            }
        }
    }
    
    //键:行索引,值:已发送行
    已发送专用词典=新建词典();
    私有void PostMessage()
    {
    对于(int i=0;i
    这似乎非常适合。使用Rx,您可以将线的推送与实际的发送操作解耦

    您可能会有一个类公开一个
    IObservable
    ,另一个类负责发送。在sender中,您将订阅observable,声明只有在与上一行不同时才需要新行。你可以用这个


    不过,Rx是一个复杂的框架。如果这是一个玩具的例子,而你不知道Rx,我可能会保留其他的解决方案之一。如果这是一个更严肃/专业的工作,我会仔细考虑这个方法,因为它更优雅和简单的实现和维护。

    你很近但是不够接近,<代码> GTHASCODE()<代码>告诉你这两行“可能”是相等的,但它并不能肯定地告诉你。两个完全不同的字符串很可能具有相同的哈希代码。把它改成
    字典
    ,我想这个解决方案会管用。@ScottChamberlain是的,你是对的,尽管我怀疑他的应用程序会有问题。为什么说
    HashSet
    应该是字典值?每个索引只有一个字符串,我会使用
    string
    我认为每个索引可能有多个字符串。
    // 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 
                                                     + "נשלח באופן אוטומטי כניסיון דרך תוכנה");
        }
    }