63

今天我想知道是否有更好的解决方案执行以下代码示例。

string keyword = " abc, foo  ,     bar";
string match = "foo";
string[] split= keyword.Split(new char[] { ',', ';' }, StringSplitOptions.RemoveEmptyEntries);
foreach(string s in split)
{
  if(s.Trim() == match){// asjdklasd; break;}
}

有没有办法在不手动迭代每个项目的情况下执行 trim() ?我正在寻找类似“按以下字符拆分并自动修剪每个结果”之类的东西。

啊,在发布之前我发现

List<string> parts = line.Split(';').Select(p => p.Trim()).ToList();

如何将字符串拆分和修剪成一行?

我仍然很好奇:可能有更好的解决方案吗?(或者编译器可能会将它们转换为与 Linq-Operation 相同的代码输出?)

4

7 回答 7

97

另一种可能的选择(避免 LINQ,无论好坏):

string line = " abc, foo  ,     bar";
string[] parts= Array.ConvertAll(line.Split(','), p => p.Trim());

但是,如果您只需要知道它是否存在 - 也许是短路?

bool contains = line.Split(',').Any(p => p.Trim() == match);
于 2009-12-29T22:33:59.660 回答
10
var parts = line
    .Split(';')
    .Select(p => p.Trim())
    .Where(p => !string.IsNullOrWhiteSpace(p))
    .ToArray();
于 2014-09-22T09:00:02.437 回答
7

我知道这已经晚了 10 年,但你也可以用 ' ' 分开:

string[] split= keyword.Split(new char[] { ',', ';', ' ' }, StringSplitOptions.RemoveEmptyEntries);

因为您还按空格字符拆分并指示拆分删除空条目,所以您将拥有所需的内容。

于 2020-08-21T10:57:33.597 回答
5

如果空格只是围绕逗号分隔字符串中的单词,这将起作用:

var keyword = " abc, foo  ,     bar";
var array = keyword.Replace(" ", "").Split(',');
if (array.Contains("foo"))
{
    Debug.Print("Match");
}
于 2009-12-29T22:51:20.900 回答
3

我建议在原始字符串上使用正则表达式,寻找“任意数量的空格后跟一个定界符后跟一个或多个空格”的模式,然后删除这些空格。然后分开。

于 2009-12-29T22:35:36.540 回答
3

试试这个:

string keyword = " abc, foo  ,     bar";
string match = "foo";
string[] split = Regex.Split(keyword.Trim(), @"\s*[,;]\s*");
if (split.Contains(match))
{
    // do stuff
}
于 2009-12-29T22:48:09.593 回答
1

你会发现很多不同的方法来做到这一点,性能变化和准确性不会很明显。我建议将它们全部插入到 NUnit 之类的测试套件中,以便找出哪个排在最前面以及哪个是准确的。

在循环中使用小、中和大量文本来检查各种情况。

于 2009-12-29T22:43:17.880 回答