假设我有一个输入字符串,我需要将其格式化为 KeyValuePair<string,float>
的列表条目。输入字符串的格式为
key:value;key:value;...
假设我有这个 Linq 代码来做这件事
var orr = from pco in (overrrides ?? string.Empty).Split(new char[] { ';' }, StringSplitOptions.RemoveEmptyEntries)
let pair = pco.Split(new char[] { ':' }, StringSplitOptions.RemoveEmptyEntries)
select new KeyValuePair<string, float>(pair[0], float.Parse(pair[1]));
现在,如果输入字符串的格式不正确,linq 将在两个可能的点上失败,索引超出范围 pair[]
和 float.Parse
上的格式异常.这两个异常都会出现,对调用者来说毫无意义。
我知道我有两个解决方法(不像 1990 年代那样使用 linq 和循环,或者捕获异常并重新打包),但是我想知道如果我检测到异常(pair.length<2
或 pair[1]
不是数字)?
最佳答案
一个简单的选择是将其更改为:
// I don't think I'd use ?? like this, but that's not the point of the question.
var unparsed = (overrrides ?? string.Empty).Split(new char[] { ';' },
StringSplitOptions.RemoveEmptyEntries);
var parsed = unparsed.Select(x => ParsePair(x));
...
static KeyValuePair<string, float> ParsePair(string text)
{
// Note that you could be more efficient using IndexOf/Substring
string[] bits = text.Split(new char[] { ':' }, StringSplitOptions.RemoveEmptyEntries);
if (bits.Length != 2)
{
throw new ArgumentException("Value should be a colon-separated key/float pair");
}
float value;
if (!float.TryParse(bits[1], out value))
{
throw new ArgumentException("Cannot parse " + bits[1] + " as a float");
}
return new KeyValuePair<string, float>(bits[0], value);
}
您仍在为“序列”部分使用 LINQ - 您只是将“如何处理单个值”部分分解为一个单独的方法。 (您可以将其作为大语句 lambda 执行,但我不会。)请注意,通过这样做,您可以独立测试 ParsePair
方法。
(您可能只使用 .Select(ParsePair)
,这取决于您使用的 C# 版本。方法组转换和类型推断并不是最好的 friend 。)
关于c# - 从 Linq 查询异常中抛出异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15199139/