2014-03-02 24 views
0

我需要遍歷一個字符串數組,並知道我以前是否看過特定的字符串值。通常情況下,我會寫這樣的事情在其他語言:循環遍歷一個字符串數組,並與以前的值進行比較

String oldValue=""; 
String newValue; 
for (i=0;i<myarray.Length;i++) 
{ 
    newValue=myarray[i]; 
    if (oldValue==newValue) 
     break; 
    ... 

    oldValue=newValue; 

} 

然而,這並不在C#中的字符串是不可變的工作。它看起來像我可以做一個正則表達式,如果我只是替換整個字符串,但這似乎是額外的開銷。其他人以前如何處理?

謝謝

+2

「newValue」在哪裏被賦值? –

+4

字符串是不可變的,但您仍然可以將變量分配給新值。你能發佈一個完整的代碼示例來證明你遇到的問題嗎? (如果有的話,請參閱上面的Grant的註釋;你在哪裏分配了'newValue'?顯然這不是一個完整的程序;它不會按原樣編譯。) –

+0

它看起來並不像你實際上嘗試這個 – Jonesopolis

回答

5

我不知道我是否理解你的問題,但如果你打算什麼是檢測在數組中重複了第一個字符串,你需要記住他們。我建議使用HashSet的,所以至少要在O(n)的運行,像這樣:

HashSet<string> prevSet = new HashSet<string>(); 

foreach (string str in myArray) 
    if (!prevSet.Add(str)) return str; 
+1

+1。你可以跳過'Contains'並執行'if(!prevSet.Add(str))return str;'See [HashSet.Add](http://msdn.microsoft.com/zh-cn/library/bb353005%28v = vs.110%29.aspx) –

+0

這很好。謝謝。我剛編輯了代碼。 – danyluis

+0

Danyluis,謝謝!你是對的,我需要真正記住所有以前的價值觀,這是比我想要做的更好的解決方案。 – Trebor

1

你能做到這一點,使單詞頻率列表:

var frequency = 
    myarray 
     .GroupBy(x => x) 
     .Select(x => new 
     { 
      Value = x.Key, 
      Count = x.Count(), 
     }); 

然後你可以只過濾此列表,其中Count > 1

+0

很酷。我不知道你可以這樣做。謝謝。 – Trebor

相關問題