我刚刚安装了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