检查存储在字典中的参数是否有效
本文关键字:参数 是否 有效 存储 字典 检查 | 更新日期: 2023-09-27 18:31:44
我有一个接收字符串的Web服务。
此字符串包含多个键 => 值,这些值与字符"+"连接。
我必须验证每个值("必需"、"不为空"),并将每个值分配给具有相同名称的变量。
这是我如何从字符串构建字典:
string firstname;
string lastname;
string amount;
string request = "firstname=foo+lastname=bar+amout=100.58";
Dictionary<string, string> arguments = new Dictionary<string, string>();
request.Split('+').ToList<string>().ForEach(p =>
{
string[] tmp = p.Split('=');
if (tmp.Length == 2)
arguments.Add(tmp[0], tmp[1]);
});
// Validate and assign : How I do with one value : (I must find a better way)
bool isValid = true;
// check "firstname"
if(arguments.ContainsKey("firstname") && string.IsNullOrWhiteSpace(arguments["firstname"]) == false)
{
firstname = arguments["firstname"];
}
else
{
isValid = false;
Logger.Write("Invalid argument : firstname");
}
// Do this for about 20 arguments, it becomes huge...
if(isValid)
{
Console.WriteLine(firstname); // Displays foo
Console.WriteLine(lastname); // Displays bar
Console.WriteLine(amout); // Displays 100.58
}
谢谢,很抱歉拼写错误,我是法国人。
我想你想要这样的东西,但由于你没有直接问一个问题,我只是猜测:
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中的副作用,我会用传统的foreach来写它,比如:
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
编辑 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
等。
在我的项目中,我总是根据它们与之交互的类型在不同的命名空间中布置扩展方法,这迫使希望使用它们的类非常明确地说明它,例如:
namespace Extensions.IDictionary { ... }
namespace Extensions.string { ... }
namespace Extensions.SomeType { ... }
namespace Extensions.IList { ... }
并且使用代码将具有using
子句来匹配:
using Extensions.IDictionary;
只拉入您感兴趣的扩展,仅此而已。
这只是一个猜测,因为你的问题还不清楚。
// Validate and assign
foreach(KeyValuePair<string,string> pair in arguments)
{
if(!String.IsNullOrEmpty(pair.Value))
{
Console.WriteLine(pair.Value);
}
}
如果你有多个名字和姓氏,你可以使用一个列表作为字典的值。这样,您可以简单地为名字、姓氏和其他值添加其他值。
要进行验证,您可以在将值添加到字典之间执行此操作:
string request = "firstname=foo+lastname=bar+amout=100.58+firstname=+lastname=bar2+amout=100.59+firstname=foo3+lastname3=bar3+amout=100.60";
Dictionary<string, List<string>> arguments = new Dictionary<string, List<string>>();
request.Split('+').ToList<string>().ForEach(f =>
{
string[] data = f.Split('=');
if (data.Length == 2)
{
if (!arguments.ContainsKey(data[0]))
{
if (data[1] != "")
arguments.Add(data[0], new List<string> { data[1] });
else
arguments.Add(data[0], new List<string> { "no firstname" });
}
else
{
if (data[1] != "")
arguments[data[0]].Add(data[1]);
else
arguments[data[0]].Add("no firstname");
}
}
});
希望对您有所帮助,再见