C# 有没有办法只传递1次缓冲字符串和1次正则表达式检查

C# 有没有办法只传递1次缓冲字符串和1次正则表达式检查,c#,system.reactive,C#,System.reactive,字节缓冲区Encoding.UTF8.GetString(b.buffer)的字符串表示形式是“Foo:Foo1” 我想根据Regex解析字符串,然后使用类RemoteData的两个不同属性(Message1和Message2)进行绑定 public class RemoteData { private string _message1; private string _message2; public RemoteData(string Message1, strin

字节缓冲区
Encoding.UTF8.GetString(b.buffer)
的字符串表示形式是“Foo:Foo1”

我想根据Regex解析字符串,然后使用类
RemoteData
的两个不同属性(
Message1
Message2
)进行绑定

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);
    }
}
我正在返回类
RemoteData
IObservable
,下面的代码工作正常

 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))));
    }
公共静态IObservable UdpStream(IPEndPoint端点)
{
返回可观察的。使用(()=>新的UdpClient(端点),
udpClient=>Observable.Defer(()=>
udpClient.ReceiveAsync().ToObservable()).Repeat().Select(b=>newremotedata(Encoding.UTF8.GetString(b.Buffer),Encoding.UTF8.GetString(b.Buffer)));
}
问:有没有办法,

  • 我只能通过一次
    Encoding.UTF8.GetString(b.Buffer)
    中的
    Observable
    选择
  • 我只需执行一次正则表达式检查,转换字符串,并将其分配给类
    RemoteData
    的各种属性

  • 谢谢

    作为解决方案,我正在使用另一个类
    SplitData
    ,并在
    RemoteData
    构造函数中检查正则表达式

    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))));
        }
    
    公共静态IObservable UdpStream(IPEndPoint端点)
    {
    返回可观察的。使用(()=>新的UdpClient(端点),
    udpClient=>Observable.Defer(()=>
    udpClient.ReceiveAsync().ToObservable()).Repeat().Select(b=>newremotedata(Encoding.UTF8.GetString(b.Buffer)));
    }
    
    如果有其他更好的方法,请告诉我。谢谢