2017-12-03 9 views
0

바이트 버퍼 Encoding.UTF8.GetString(b.Buffer)의 문자열 표현은 "Foo : Foo1"입니다.버퍼 문자열을 한 번만 전달할 수있는 방법이 있습니까? 정규식 검사

문자열을 Regex에 대해 구문 분석하고 RemoteData 클래스의 다른 두 속성 (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)))); 
    } 

날 경우 다른 더 좋은 방법을 알려 주시기 바랍니다. 감사!