2014-02-13 103 views
1
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

    • 如果整個行不相同,但相同的字線在其他線(S),然後使用PostFacebookWall方法。

  2. 我使用的是bool變量,所以它不會一遍遍地發送相同的線。

    • 我希望它發送一行,而不管是否只有一行或是否有多行。

的問題是我使用的bool現在,它會發送一條線,然後將永遠不會發送任何其他線路的所有道路。

回答

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 
               + "נשלח באופן אוטומטי כניסיון דרך תוכנה"); 
    } 
} 
+0

你很近但是不夠接近''GetHashCode()'告訴你兩條線「可能」是相等的,但它不能確定地告訴你。兩個完全不同的字符串很可能具有相同的哈希碼。將其更改爲'Dictionary >',我認爲這個解決方案可以工作。 –

+0

@ScottChamberlain是的,你是對的,雖然我懷疑他的應用程序會有問題。你爲什麼說'HashSet '應該是字典值?每個索引只有一個字符串,我會使用'string' – Anri

+0

我認爲每個索引可能有多個字符串。 –

0

也許我會監督一些事情,但我只記得字符串變量的最後一行,並且只在當前行與最後一行不同時才執行inner for循環。

0

這似乎非常適合於Reactive Extensions。使用Rx,您可以將線路推送與實際的發送操作分開。

您可能會有一個公開IObservable<Line>的類和另一個負責發送的類。在發件人中,您將訂閱observable,並聲明只有在與上次推送的行不同時才需要新行。你可以使用DistinctUntilChanged這個。

雖然Rx是一個複雜的框架,但需要理解。如果這是某種玩具的例子,你不知道Rx,我可能會保留其他解決方案之一。如果這是一個更嚴肅/專業的工作,我會徹底考慮這個方法,因爲它更加優雅,易於實施和維護。