Разделить строку на три отдельные части - PullRequest
0 голосов
/ 30 августа 2018

У меня есть строка URL, входящая в API, например c1:1=25.

*http://mysite/api/controllername?serial=123&c1:=25*

Я хочу разделить его на имя канала (c1), номер чтения канала (1) после двоеточия и значение (25).

Есть также случаи, когда двоеточие отсутствует, так как это фиксированное значение, такое как серийный номер (serial = 123).

Я создал класс:

public class UriDataModel
{
     public string ChannelName { get; set; }
     public string ChannelNumber { get; set; }
     public string ChannelValue { get; set; }
}

Я пытаюсь использовать IEnumerable с некоторым LINQ и не захожу слишком далеко.

var querystring = HttpContext.Current.Request.Url.Query;
querystring = querystring.Substring(1);           

var urldata = new UrlDataList
{
    UrlData = querystring.Split('&').ToList()
};

IEnumerable<UriDataModel> uriData =
        from x in urldata.UrlData
        let channelname = x.Split(':')
        from y in urldata.UrlData
        let channelreading = y.Split(':', '=')
        from z in urldata.UrlData
        let channelvalue = z.Split('=')
        select new UriDataModel()
        {
             ChannelName = channelname[0],
             ChannelNumber = channelreading[1],
             ChannelValue = channelvalue[2]
        };

        List<UriDataModel> udm = uriData.ToList();

Мне кажется, что я здесь слишком усложняю.

Таким образом, я хочу разбить строку на три части, а там, где нет двоеточия, разбить ее на две части.

Любые указатели будут великолепны. ТИА

1 Ответ

0 голосов
/ 30 августа 2018

Вы можете использовать регулярные выражения. Я думаю, что вы переключили номер канала и двоеточие в вашем примере, поэтому мой код отражает это предположение.

public static (string channelName, string channelNumber, string channelValue) ParseUrlData(string urlData)
{
    var regex = new Regex(@"serial=(\d+)(&c(:\d+)?=(\d+))?");
    var matches = regex.Match(urlData);
    string name = null;
    string number = null;
    string value = null;
    if (matches.Success)
    {
        name = matches.Groups[1].Value;
        if (matches.Groups.Count == 5) number = matches.Groups[3].Value.TrimStart(':');
        if (matches.Groups.Count >= 4) value = matches.Groups[matches.Groups.Count - 1].Value;
    }

    Console.WriteLine($"[{name}] [{number}] [{value}]");
    return (name, number, value);
}

Тогда вы можете назвать это так

(var channelName, var channelNumber, var channelValue) = ParseUrlData("serial=123&c:1=25");
(var channelName, var channelNumber, var channelValue) = ParseUrlData("serial=123&c=25");
(var channelName, var channelNumber, var channelValue) = ParseUrlData("serial=123");

и он вернется (и напечатает)

[123] [1] [25]
[123] [] [25]
[123] [] []
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...