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

sxpgvts3  于 2023-01-31  发布在  .NET
关注(0)|答案(7)|浏览(134)

我正在尝试以下方法

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”。
如何修剪列表中的所有元素?

dy2hfwbg

dy2hfwbg1#

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

如果你只需要最终结果字符串,而不是中间集合,那么你可以使用正则表达式来整理字符串,你需要基准测试来确定正则表达式是否优于分割-修剪-连接技术:

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

b5buobof2#

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

应导致:列表(){" 11111 "," 22222 "}
我没有使用拆分和重新连接的解决方案(选择的解决方案),因为其中一个字符串项目中可能有逗号。正则表达式版本不是自解释的。这是老派的,但更安全,可以很容易地理解...

svgewumm

svgewumm3#

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

voase2hg

voase2hg4#

试试看

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

hs1rzwqc5#

现在的情况是,您试图使用foreach语句修改集合-这是一个禁忌。集合不能用foreach修改。
你需要把它修改为for循环,或者,使用lambdas,你可以使用LukeH的解决方案。

ars1skjm

ars1skjm6#

问题是dddd和eeeee之间没有逗号,如果希望它们分开,需要在' '上拆分,去掉逗号,然后修剪多余的空格。

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

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

2izufjch7#

这可以通过LINQ one liner轻松完成:
请记住经验法则:

SELECT-〉用于转换元素
WHERE-〉用于过滤元素

现在,我们可以使用SELECT子句来转换所有元素

List<string> listString = new List<string>(){"abc ", "xyz ", " Abc ", "  zx"};
listString = listString.Select(x => x.Trim()).ToList();

就这样,事情都做完了。

相关问题