【问题标题】:How do I get quoted fields from a delimited string as a list of unquoted values using LINQ?如何使用 LINQ 从分隔字符串中获取带引号的字段作为未引用值的列表?
【发布时间】:2025-11-30 19:35:01
【问题描述】:

原始文本行是: "125"|"Bio Methyl"|"99991"|"OPT12"|"CB"|"1"|"12"|"5"|"23"

预期的字符串列表不含双引号,并由|分割:

125
Bio Methyl
99991

文本可能包含空引号字符串,如(以前的“OPT12”值现在为空“”):

"125"|"Bio Methyl"|"99991"|""|"CB"|"1"|"12"|"5"|"23"

所以我检查了这两个问题和答案:QA1QA2 以得出我的解决方案。

var eList = uEList.ElementAt(i).Split(BarDelimiter);
var xList = eList.ElementAt(0).Where(char.IsDigit).ToList();

当然它不能按我需要的方式工作,因为xList 是一个包含以下元素的列表:xList(0) = 1, xList(1) = 2, xList(2) = 5

我不想再写一行来加入他们,因为这看起来不是一个合适的解决方案。 LINQ 一定有更好的东西吧?

【问题讨论】:

  • 我刚刚编辑了问题,使标题更加精确和可搜索,并添加了支持空引用值的要求。

标签: c# string linq char delimiter


【解决方案1】:

这个怎么样:

// Based on OPs comment: preserve empty non-quoted entries.
var splitOptions = StringSplitOptions.None;
//change to the below if empty entries should be removed
//var splitOptions = StringSplitOptions.None;
var line = "\"125\"|\"Bio Methyl\"|\"99991\"|\"OPT12\"|\"CB\"|\"1\"|\"12\"|\"5\"|\"23\"";
var result = line
    .Split(new[] { "|" }, splitOptions)
    .Select(p => p.Trim('\"'))
    .ToList();
Console.WriteLine(string.Join(", ", result));

Split(...) 语句将输入拆分为一个数组,其中包含如下部分:

{ \"99991\", \"OPT12\", ... };

p.Trim('\"') 语句从每个部分中删除前导和尾随引号。

【讨论】:

  • @GrantWinney true,包含两个分隔符,并且没有像“”这样的空引用元素。
  • RemoveEmptyEntries 指定适用的 String.Split 方法重载是在返回值中包含还是省略空子字符串。因此它不能用作必须保留的空值,例如OPT12 列可以为空.
  • 我对@9​​87654321@ 的行为感到困惑。当我测试它时,这实际上包括空值......知道为什么吗?
  • 是的,在进行拆分时它们不为空,所以 "abc"|""|"defg" 将拆分为一个带引号字符串的数组:{ "abc", "", "defg " }。在下一步中,对p.Trim("\"") 的调用将删除引号,因此您最终会得到一个空字符串。
  • 我认为它们应该非常相似。他们可能会做大约相同数量的字符串分配。 split + trim 组合会减少搜索量,但我怀疑它在实践中会有什么不同。
【解决方案2】:

作为修剪的替代方法,如果您的值中没有 ",您可以在拆分之前简单地清理输入。您可以通过将" 符号替换为任何内容(""string.Empty)来实现。

您的Split 代码随后会给出正确的结果:

string uEList = "\"125\"|\"Bio Methyl\"|\"99991\"|\"OPT12\"|\"CB\"|\"1\"|\"12\"|\"5\"|\"23\"";
var eList = uEList.Replace("\"", string.Empty).Split(BarDelimiter);

【讨论】:

  • 我试过你的和@Alex 的解决方案。两者都工作正常。然而,在性能方面,我需要你的帮助来向我解释哪一个给出了优化的结果,为什么或如何,(因为这是一个将在循环中重复很多次的函数)