c# - 从 Linq 查询异常中抛出异常

标签 c# linq exception

假设我有一个输入字符串,我需要将其格式化为 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<2pair[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/

相关文章:

c# - 谁能告诉我为什么在 LINQ 中会发生这种情况?

c# - Linq Boolean 返回异常 DROPDOWNLIST 有一个无效的 SelectedValue,因为它不存在于项目列表中

c# - 不支持图像的给定路径格式

c# - 有没有办法使用 LINQ 根据封闭条件(即不是简单的 WHERE 子句)选择一系列项目?

c# - 绑定(bind)到字典的 DataGridView

java - 定制异常

java - 异常处理中如何让程序catch错误-Java

java - LayoutParams 上的 ClassCastException 从 LinearLayout 到 AbsListView

c# - 包含 "add new value if key not in dictionary"的多维字典

关于范围的 C# 内存分配/取消分配问题