LINQ lambda表达式替换字符串中的多个字符?

3 c# linq lambda replace

是否有可能编写一个lambda表达式,它将迭代对象数组并替换其中一个属性中的'X','Y',''和'Z'的所有出现?

例如

return query.Select(x => { x.SomePropertyName= x.SomePropertyName.Trim().Replace(' ', "_"); return x; }).ToList();
Run Code Online (Sandbox Code Playgroud)

出于某种原因,当我需要替换多个字符时,上面的查询不会替换单个字符.

谢谢

Fre*_*örk 6

当我想用一个单独的其他字符替换多个字符中的一个时,我经常使用string.Split和string.Join的组合:

char[] unwanted = new[] {'X', 'Y', 'Z'};
query = query.Select(x =>
{
    x.SomePropertyName = string.Join("_", x.SomePropertyName.Split(unwanted));
    return x;
});
Run Code Online (Sandbox Code Playgroud)

这将取代任何发生'X','Y''Z''_'.您可以将其与您选择的循环结构相结合.

正如评论中所讨论的那样,Select在这种情况下使用并没有真正添加任何值.一个正常的foreach循环可以完成这项工作,甚至可以生成更紧凑的代码:

char[] unwanted = new[] {'X', 'Y', 'Z'};
foreach(var x in query)
{
    x.SomePropertyName = string.Join("_", x.SomePropertyName.Split(unwanted));
};
Run Code Online (Sandbox Code Playgroud)


dtb*_*dtb 5

如果要使用LINQ,可以使用Select,ToArray和String(char [])构造函数,如下所示:

var result = query.ToList();
foreach (var x in result)
{
    x.SomeProperty =
        new string(x.SomeProperty
                    .Select(c => (c == 'X' || ... || c == ' ') ? '_' : c)
                    .ToArray());
}
Run Code Online (Sandbox Code Playgroud)

请注意,LINQ不是用于引起副作用,而是用于从现有的枚举中创建新的枚举.所以foreach循环在这里更好.


但为什么不简单的一系列替换呼叫呢?

var result = query.ToList();
foreach (var x in result)
{
    x.SomeProperty = x.SomeProperty
                      .Replace('X', '_')
                      .Replace('Y', '_')
                      .Replace('Z', '_')
                      .Replace(' ', '_');
}
Run Code Online (Sandbox Code Playgroud)

或者您是否尝试用一系列字符替换单个字符?然后使用带有两个字符串的String.Replace重载:

var result = query.ToList();
foreach (var x in result)
{
    x.SomeProperty = x.SomeProperty.Replace(" ", "ABC");
}
Run Code Online (Sandbox Code Playgroud)