Я только что установил VS2008 и столкнулся с проблемой, которую, я уверен, можно решить с помощью лямбды или делегатов (или комбинации!).
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 (terminator)" на функцию, которая передается в метод.
Я мог бы написать свои различные функции, такие как:
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 ().
Я очень невежественен, когда дело касается делегатов, и я не уверен, кажется ли это подходящим местом для лямбды, но что-то говорит мне, что это так.
Телефонный код:
// Enter username .
if (HasData(s,"login:"))
SendData(s, switchUser + TelnetHelper.CRLF);
HasData идентична ReadData, но возвращает строку bool вместо строки (которую я также хотел бы выделить в один метод, используя некоторую хитрость - но это второстепенный вопрос - не стесняйтесь ответить на этот вопрос.
Только для справки:
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);
}