c# – Linq lambda foreach

尝试将每个字符串包装在数组中,但它不起作用,意味着foreach循环,请解释原因

string s = "keepsakes,table runners,outdoor accessories";
List<string> keys = s.Split(',').ToList();
keys.ForEach(x => x = String.Concat("%", x, "%"));
s = String.Join(",", keys);
Console.WriteLine(s); 

需要获得“%纪念品%,%表格运动员%,%户外配件%”

UPD:
非常感谢您的建议(这是一样的)

但有些人可以回答为什么这是有效的,而不是在以下工作:

宾语

    public class MyItems
    {
        public string Item { get; set; }
    }

和功能

        string s = "keepsakes,table runners,outdoor accessories";
        List<MyItems> keys = s.Split(',').ToList().Select(x => new MyItems(){ Item = x }).ToList();
        keys.ForEach(x => x.Item = String.Concat("%", x.Item, "%"));
        s = String.Join(",", keys.Select(x => x.Item).ToList());
        Console.WriteLine(s);
最佳答案
另一种方法可能是使用Regex而不是LINQ:

string s = "keepsakes,table runners,outdoor accessories";
string pattern = "\\,+";
string replacement = "%,";

Regex rgx = new Regex(pattern);
string result = string.Format("%{0}%", rgx.Replace(s, replacement));

编辑:

之所以使用类来分配字符串是因为当你在第一个实例中使用foreach时:

keys.ForEach(x => x = String.Concat("%", x, "%"));

x,键的元素(字符串)是通过值传递给函数ForEach的引用.以此为例:

var myString = "I'm a string";

Console.WriteLine(myString);

ChangeValue(myString);

Console.WriteLine(myString);

void ChangeValue(string s)
{
    s = "something else";
}

如果您运行该代码段,您将看到在ChangeValue方法中不会更改myString,因为我们正在尝试替换引用. ForEach方法也会发生同样的情况,这是您无法在ForEach中更改列表值的主要原因.

相反,如果你这样做:

class MyClass{
    public string aString;
 }

void ChangeValue(MyClass s)
{
    s.aString = "something else";
}

 var myClass = new MyClass();
 myClass.aString =  "I'm a string";

 Console.WriteLine(myClass.aString);

 ChangeValue(myClass);

 Console.WriteLine(myClass.aString);

您承认在第二个Console.WriteLine中,字段aString的值将更改为“其他”. Here很好地解释了如何通过值传递引用类型

转载注明原文:c# – Linq lambda foreach - 代码日志