【问题标题】:Get specific value from string read from stream从流中读取的字符串中获取特定值
【发布时间】:2014-01-26 22:08:08
【问题描述】:

我有一个使用流阅读器从流中读取的字符串。这是在 WEB API 调用并从请求中获取响应之后。对于清晰的视图,这是我的代码。

HttpWebRequest request = (HttpWebRequest)WebRequest.Create("SOME URL");
HttpWebResponse response = (HttpWebResponse)request.GetResponse();

Stream resStream = response.GetResponseStream();
StreamReader reader = new StreamReader(resStream);

string s = reader.ReadToEnd();

resStream.Flush();
resStream.Close();
reader.Close();

我的字符串有一个值“value1=somestring1&value2=somestring2”。我想得到 somestring1 和 somestring2。我认为有更好的方法可以做到这一点,而不是将整个流转换为字符串来获取每个值。你有什么想法?谢谢!

【问题讨论】:

  • 您希望这在同一行吗?然后您可以逐行阅读,直到找到它们为止。
  • 我不太确定。这来自 facebook API。
  • 实际上,您需要从流中读取数据才能使用它,因此将其读入字符串然后拆分它对我来说似乎是正确的选择。我建议使用由 & 字符分隔的var parts = s.Split(new char[] { '&' });。之后,您可以通过 = 字符再次拆分。
  • 我曾考虑过这样做,但我也认为有更好的方法来做到这一点而无需做太多工作。
  • 如果流有换行符,您可以读取每一行并对其进行处理。否则,您一次只能使用一个字符或整个流。

标签: c# string stream


【解决方案1】:

我建议读入字符串,然后使用如下方法拆分数据:

private Dictionary<string, string> SplitValuePairString(string originalString)
{
    Dictionary<string, string> result = new Dictionary<string, string>();

    if (string.IsNullOrEmpty(originalString))
    {
        var keyValuePairs = originalString.Split(new char[] { '&' });

        foreach (string keyValuePair in keyValuePairs)
        {
            var parts = keyValuePair.Split(new char[] { '=' });

            if (parts.Length == 2)
            {
                result.Add(parts[0], parts[1]);
            }
        }
    }

    return result;
}

【讨论】:

    【解决方案2】:

    我认为您可以使用Regex 解析您的字符串响应(如果它始终具有此数量的参数,否则您将在MatchCollection 中获得更多结果):

    MatchCollection results = Regex.Matches(reader.ReadToEnd(), "=([a-z]*[0-9]*)");
    
    string value1 = results[0].Groups[1].Value;
    string value2 = results[1].Groups[1].Value;
    

    此代码完全从字符串 "value1=sometring1&amp;value2=somestring2" 返回:

    somestring1
    somestring2
    

    【讨论】:

    • @ljpv14 只是想知道,出于好奇,为什么我的回答值得 -1 ?它的工作结果正是所要求的。所以请随时回答我以了解我的代码有什么问题。
    • @tofutim 我认为这只是 StackOverflow 上的代码问题。我只是尽可能地编写代码来提供帮助,但在这里我不明白哪里出了问题,为什么我应该得到一个 -1 和一个完全有效的解决方案。
    • 确实,如果您执行 reader.ReadToEnd(),您将整个字符串拉出
    【解决方案3】:

    如果您将流转换为string,那么您可以使用System.Web.HttpUtility.ParseQueryString(s) 轻松获得 somestring1 和 somestring2

    【讨论】:

    • 这是最简单最有效的答案。谢谢!
    猜你喜欢
    • 2013-11-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多