如何修剪列表中的所有元素?

Bru*_*oLM 15 .net c# linq

我正在尝试以下方法

string tl = " aaa, bbb, ccc, dddd             eeeee";

var tags = new List<string>();
tags.AddRange(tl.Split(','));
tags.ForEach(x => x = x.Trim().TrimStart().TrimEnd());

var result = String.Join(",", tags.ToArray());
Run Code Online (Sandbox Code Playgroud)

但它不起作用,标签总是以"aaa","bbb"的形式返回.

如何修剪列表中的所有元素?

Luk*_*keH 30

// you can omit the final ToArray call if you're using .NET 4
var result = string.Join(",", tl.Split(',').Select(s => s.Trim()).ToArray());
Run Code Online (Sandbox Code Playgroud)

如果您只需要最终结果字符串而不是中间集合,那么您可以使用正则表达式来整理字符串.您需要进行基准测试以确定正则表达式是否优于split-trim-join技术:

var result = Regex.Replace(tl, @"(?<=^|,) +| +(?=,|$)", "");
Run Code Online (Sandbox Code Playgroud)

  • @Justin:OP在哪里说这是一个问题?据我所知,列表中应该有四个元素:*"aaa"*,*"bbb"*,*"ccc"*和*"dddd eeeee"*. (5认同)

Lee*_*Lee 7

您的方法不起作用的原因是它x是在ForEach调用中处理的当前字符串引用的副本(即委托的本地).因此,分配不会影响列表中引用的项目.


Cod*_*ife 7

遇到了同样的问题。@Lee 已经解释过 Lamda .ForEach() 使用副本。

您可以编写这样的扩展方法并使用 for 循环(foreach 也不可能):

public static class StringListExtensions
{
    public static void TrimAll(this List<string> stringList)
    {
        for (int i = 0; i < stringList.Count; i++)
        {
            stringList[i] = stringList[i].Trim(); //warning: do not change this to lambda expression (.ForEach() uses a copy)
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

像这样使用它:

var productNumbers = new List<string>(){ "11111", " 22222 " }
productNumbers.TrimAll();
Run Code Online (Sandbox Code Playgroud)

应该导致: List(){ "11111", "22222" }

我没有使用拆分和重新连接解决方​​案(选择的解决方案),因为其中一个字符串项中可以有一个逗号。正则表达式版本不是不言自明的。这是老派但更安全,很容易理解......


Gre*_*ews 6

尝试

List<string> lstSelect = string_test.Split(',').Select(x => x.Trim()).ToList();
Run Code Online (Sandbox Code Playgroud)