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

时间:2010-08-20 13:20:33

标签: c# .net 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());

但它不起作用,标签总是以“aaa”,“bbb”的形式返回。

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

6 个答案:

答案 0 :(得分:29)

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

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

var result = Regex.Replace(tl, @"(?<=^|,) +| +(?=,|$)", "");

答案 1 :(得分:7)

您的方法不起作用的原因是x是在ForEach调用中处理的当前字符串引用的副本(即代理的本地)。因此,赋值不会影响列表中引用的项目。

答案 2 :(得分:4)

发生了什么事情,你正在尝试使用foreach声明来修改集合 - 这是一个禁忌。无法使用foreach修改集合。

你需要修改一个for循环,或者,使用lambdas,你可以使用LukeH的解决方案。

答案 3 :(得分:2)

遇到同样的问题。 @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)
        }
    }
}

像这样使用它:

var productNumbers = new List<string>(){ "11111", " 22222 " }
productNumbers.TrimAll();

应导致:List(){“ 11111”,“ 22222”}

我没有使用拆分并重新加入解决方案(选择的解决方案),因为其中一个字符串项内部可能存在逗号。 regex版本不是自解释的。这是老式的方法,但是更安全,而且很容易理解...

答案 4 :(得分:1)

你的问题是dddd和eeeee之间没有逗号。如果你想让它们分开,你需要拆分' ',删除逗号,然后修剪额外的空格。

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

var result = t1.Split(' ').Where(s => !String.IsNullOrEmpty())
                          .Select(s => s.Replace(',','').Trim())
                          .ToArray();

答案 5 :(得分:0)

尝试

List<string> lstSelect = string_test.Split(',').Select(x => x.Trim()).ToList();