是否有可能编写一个lambda表达式,它将迭代对象数组并替换其中一个属性中的'X','Y',''和'Z'的所有出现?
例如
return query.Select(x => { x.SomePropertyName= x.SomePropertyName.Trim().Replace(' ', "_"); return x; }).ToList();
Run Code Online (Sandbox Code Playgroud)
出于某种原因,当我需要替换多个字符时,上面的查询不会替换单个字符.
谢谢
当我想用一个单独的其他字符替换多个字符中的一个时,我经常使用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)
如果要使用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)