将字符串分成三个独立的部分

时间:2018-08-30 05:43:59

标签: c# asp.net-web-api query-string asp.net-apicontroller

我有一个进入API的URL字符串,例如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();

我觉得这里的事情太复杂了。

总而言之,我想将字符串分成三部分,没有冒号的地方则将其分成两部分。

任何指针都会很棒。 TIA

1 个答案:

答案 0 :(得分:0)

您可以使用正则表达式。我认为您在示例中切换了频道号和冒号,所以我的代码反映了这一假设。

transformers = []

# Combine both your operations here only
transformers.extend([([num_col], [Imputer(strategy="median"), 
                                  StandardScaler()]) for num_col in num_cols])
transformers.extend([(cat_col , [CategoricalImputer()]) for cat_col in cat_cols])

num_cat_union = DataFrameMapper(transformers,
                                input_df=True,
                                df_out=True)

# Your other code
...
...

然后您可以这样称呼

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");