Я думаю вы хотите что-то вроде этого, но так как вы не acutally задать вопрос, я просто угадать:
request.Split('+').ToList<string>().ForEach(p =>
{
string[] tmp = p.Split('=');
if (tmp.Length == 2 && !string.IsNullOrWhiteSpace(tmp[1]))
{
// edit - if your string can have duplicates, use
// Dictionary<U,K>.ContainsKey(U) to check before adding
var key = tmp[0];
var value = tmp[1];
if(!arguments.ContainsKey(key))
{
arguments.Add(key, value);
}
else
{
//overwrite with new value
//could also maybe throw on duplicate or some other behavior.
arguents[key]=value;
}
}
else
throw InvalidOperationException("Bad dictionary string value");
});
Кроме того, я бы вопрос использования ToList-> ForEach, если это было передо мной в обзоре кода. Вы хотите, чтобы избежать побочных эффектов в Linq, я написал бы его с традиционным Еогеаспом как:
var itemValues = request.Split('+');
foreach(var item in itemValues)
{
string[] tmp = item.Split('=');
if (tmp.Length == 2 && !string.IsNullOrWhiteSpace(tmp[1]))
arguments.Add(tmp[0], tmp[1]);
else
throw InvalidOperationException("Bad dictionary string value");
});
// Validate and assign
//read values from the dictionary
//use ContainsKey to check for exist first if needed
Console.WriteLine(arguments["firstname"]); // Displays foo
Console.WriteLine(arguments["lastname"]); // Displays foo
Console.WriteLine(arguments["amout"]); // Displays 100.58
Edit 2 - Вы должны инкапсулировать логику в методе:
private string TryGetValue(IDictionary<string,string> dict,string key)
{
string value = null;
if(dict.ContainsKey(key) && !string.IsNullOrWhiteSpace(dict[key]))
{
value = dict[key];
}
else
{
Logger.Write("Invalid argument : " + key);
}
return value;
}
Теперь вы можете сказать:
string firstName = TryGetValue(arguments,"firstname");
string lastName= TryGetValue(arguments,"lastName");
string amount = TryGetValue(arguments,"amount");
bool isValid = firstName!=null && lastName != null && amount != null;
if(isValid)
{
Console.WriteLine(firstName); // Displays foo
Console.WriteLine(lastName); // Displays bar
Console.WriteLine(amout); // Displays 100.58
}
TryGetValue
бы превосходный метод расширения:
public static class Extensions
{
public static string TryGetValue(this IDictionary<string,string> dict, string key)
{
string value = null;
if(dict.ContainsKey(key) && !string.IsNullOrWhiteSpace(dict[key]))
{
value = dict[key];
}
else
{
Logger.Write("Invalid argument : " + key);
}
return value;
}
}
Теперь вызывающий код будет выглядеть следующим образом:
string firstName = arguments.TryGetValue("firstname");
string lastName= arguments.TryGetValue("lastname");
string amount = arguments.TryGetValue("amount");
Последнее редактирование - записку о методах Удлинитель - Да, они опрятны, но это также легко случайно попасть в плохой ситуации перерасхода их. Прочитайте в msdn и блоги о них, следуйте рекомендациям. Избегайте расширений на общие типы, такие как object
, string
ect.
В своих проектах я всегда раскладывать методы расширения в различных пространствах имен в зависимости от типа они взаимодействуют с, что заставляет классы, которые хотели бы использовать их, чтобы быть очень экспликации об этом нравится:
namespace Extensions.IDictionary { ... }
namespace Extensions.string { ... }
namespace Extensions.SomeType { ... }
namespace Extensions.IList { ... }
и потребляющих код не будет иметь using
положения, чтобы соответствовать:
using Extensions.IDictionary;
тянуть в только расширения ваш интересует, не больше.
гм .. что проблема на самом деле? – Tigran
Что вы хотите изменить? –
Например, я не могу понять, как проверить, существует ли в словаре первое имя, если оно не пустое, и как заполнить переменную «firstname» значением dictionnary. В действительности существует около 20 аргументов, и для каждого из них очень важно проверить их. –