2017-12-03 13 views
0

バイトバッファEncoding.UTF8.GetString(b.Buffer)の文字列表現は"Foo:Foo1"です。バッファー文字列を1回だけ渡す方法はありますか。正規表現チェック

文字列をRegexに対して解析し、次にRemoteDataという2つの異なるプロパティ(Message1Message2)でバインドしたいと思います。

public class RemoteData 
{ 
    private string _message1; 
    private string _message2; 

    public RemoteData(string Message1, string Message2) 
    { 
     this.Message1 = Message1; 
     this.Message2 = Message2; 
    } 

    public string Message1 
    { 
     get 
     { 
      if (IsValidMessage(_message1)) 
       return _message1 = _message1.Split(':')[0].ToString(); 
      return _message1; 
     } 
     set 
     { 
      _message1 = value; 
     } 
    } 

    public string Message2 
    { 
     get 
     { 
      if (IsValidMessage(_message2)) 
       return _message2 = _message2.Split(':')[1].ToString(); 
      return _message2; 
     } 
     set 
     { 
      _message2 = value; 
     } 
    } 

    private static bool IsValidMessage(string value) 
    { 
     const string expression = (@"([\w]+):([\w]+)"); 

     return Regex.IsMatch(value, expression, RegexOptions.IgnoreCase); 
    } 
} 

私はクラスRemoteDataIObservableを返していますし、コードの下に良い取り組んでいます。

public static IObservable<RemoteData> UdpStream(IPEndPoint endpoint) 
    { 
     return Observable.Using(() => new UdpClient(endpoint), 
      udpClient => Observable.Defer(() => 
       udpClient.ReceiveAsync().ToObservable()).Repeat().Select(b => new RemoteData(Encoding.UTF8.GetString(b.Buffer), Encoding.UTF8.GetString(b.Buffer)))); 
    } 

質問:

  1. は私がObservable選択に一度だけEncoding.UTF8.GetString(b.Buffer)を渡すことができ、どのような方法はありますか?
  2. 正規表現をチェックして文字列を変換し、クラスRemoteDataのさまざまなプロパティに代入するだけで済みますか?

ありがとう!

答えて

1

解決策として、別のクラスSplitDataを使用し、RemoteDataのコンストラクタでRegexをチェックしています。

public class SplitData 
{ 
    public string Message1 { get; set; } 
    public string Message2 { get; set; } 
} 
public class RemoteData 
{ 
    private SplitData _SplitData; 

    public RemoteData(string Message) 
    { 
     this.Message = Message; 
     if (IsValidMessage(this.Message)) 
     { 
      _SplitData = new SplitData 
      { 
       Message1 = Message.Split(':')[0].ToString(), 
       Message2 = Message.Split(':')[1].ToString() 
      }; 
     } 
    } 

    public string Message { get; } 
    public SplitData SplitData 
    { 
     get 
     { 
      return _SplitData; 
     } 
     set 
     { 
      _SplitData = value; 
     } 
    } 
    private static bool IsValidMessage(string value) 
    { 
     const string expression = (@"([\w]+):([\w]+)"); 

     return Regex.IsMatch(value, expression, RegexOptions.IgnoreCase); 
    } 
} 

UdpStream方法、

public static IObservable<RemoteData> UdpStream(IPEndPoint endpoint) 
    { 
     return Observable.Using(() => new UdpClient(endpoint), 
      udpClient => Observable.Defer(() => 
       udpClient.ReceiveAsync().ToObservable()).Repeat().Select(b => new RemoteData(Encoding.UTF8.GetString(b.Buffer)))); 
    } 

に一つのパラメータを渡す私は、他の場合より良い方法を教えてください。ありがとう!

関連する問題