2013-06-04 8 views
1

Существует сценарий, в котором я отправляю HTTP-запрос и получаю этот ответ String с сервера.Извлечь значение ключа из строки Использование Linq

submitstatus: 0 
smsid: 255242179159525376 

     var streamResponse = newStreamReader(response.GetResponseStream()).ReadToEnd().ToString(); 

Я хочу извлечь значения ключей с помощью LINQ. Новое в LINQ любые предложения.

+0

Вы можете оставить значение streamResponse? – Rockstart

+0

@Rockstart значение ответа на поток отправляет: 0 smsid: 255242179159525376 – ankur

ответ

2

Я использую output строку для имитации результата

string output = @"submitstatus: 0 
smsid: 255242179159525376"; 

// you can use regex to match the key/value 
// what comes before `:` will be the key and after the value 
var matches = Regex.Matches(output, @"(?<Key>\w+):\s(?<Value>[^\n]+)"); 

// for each match, select the `Key` match as a Key for the dictionary and 
// `Value` match as the value 
var d = matches.OfType<Match>() 
    .ToDictionary(k => k.Groups["Key"].Value, v => v.Groups["Value"].Value); 

Таким образом, вы будете иметь Dictionary<string, string> с ключи и значения.


Использование Split метод

var keysValues = output.Split(new string[] { ":", "\r\n" }, 
        StringSplitOptions.RemoveEmptyEntries); 

Dictionary<string, string> d = new Dictionary<string, string>(); 
for (int i = 0; i < keysValues.Length; i += 2) 
{ 
    d.Add(keysValues[i], keysValues[i + 1]); 
} 

Попытка использовать чисто Linq

var keysValues = output.Split(new string[] { ":", "\r\n" }, 
        StringSplitOptions.RemoveEmptyEntries); 
var keys = keysValues.Where((o, i) => (i & 1) == 0); 
var values = keysValues.Where((o, i) => (i & 1) != 0); 
var dictionary = keys.Zip(values, (k, v) => new { k, v }) 
        .ToDictionary(o => o.k, o => o.v); 
+0

Я тоже думал об этом. Словарь <строка, строка> outputDictionary = streamResponse.Split (':') [1] . Выберите (x => x) .TDDictionary (y => y [0], y => y [1]); но не в состоянии выяснить, что нужно сделать в Select Statement .... – ankur

0

Почему вы не используете регулярное выражение? Smth нравится:

(?<=submitstatus:\s)\d+ 

для submitstatus и

(?<=smsid:\s)\d+ 

для smsid

+0

Я ищу решение LINQ ........... – ankur

Смежные вопросы