我剛剛安裝了VS2008,遇到了一個問題,我肯定可以用lambda或代表(或組合!)解決問題。用Lambda和代表重構
private string ReadData(TcpClient s, string terminator)
{
// Reads a byte steam into a string builder until either data is unavailable or the terminator has not been reached
var sb = new StringBuilder();
do
{
var numBytesRead = s.GetStream().Read(byteBuff, 0, byteBuff.Length);
sb.AppendFormat("{0}", Encoding.ASCII.GetString(byteBuff, 0, numBytesRead));
} while (s.GetStream().DataAvailable && !sb.ToString().Contains(terminator));
return sb.ToString();
}
問題是,有時我需要檢查字符串是否包含兩個不同的值。有時我可能需要檢查它的三個值。
因此,我建議將「!sb.ToString()。Contains(終止符)」更改爲傳遞給該方法的函數。
我可以寫我的不同的功能,如:
private bool compare1(string s, string t) {
return s.contains(t)
}
private bool compare2(string s, string t1, string t2) {
return (s.compare(t1) or s.compare(t2)
}
// etc...
然後,當我想用3個不同的值進行比較,創建委託給這些函數之一,然後傳遞到READDATA()方法。
對於代表們,我非常無能,而且我不確定這是不是一個lambda的正確位置,但有些東西告訴我它是。
調用代碼是這樣的:
// Enter username .
if (HasData(s,"login:"))
SendData(s, switchUser + TelnetHelper.CRLF);
HasData是相同的READDATA,但返回一個布爾值,而不是一個字符串(這也是我想使用一些詭計分解出成一個方法 - 但是這次要的問題 - 隨時接聽,雖然
僅供參考:
private bool HasData(TcpClient s, string terminator)
{
// Reads a byte steam into a string builder until either data is unavailable or the terminator has not been reached
var sb = new StringBuilder();
do
{
var numBytesRead = s.GetStream().Read(byteBuff, 0, byteBuff.Length);
sb.AppendFormat("{0}", Encoding.ASCII.GetString(byteBuff, 0, numBytesRead));
} while (s.GetStream().DataAvailable && !sb.ToString().Contains(terminator));
return sb.ToString().Contains(terminator);
}
儘管謂詞(sb)需要更改爲謂詞(sb.ToString()) - 不會讓我編輯。 – 2009-05-01 03:08:30