是否有可能编写一个lambda表达式,它将迭代对象数组并替换其中一个属性中的'X','Y',''和'Z'的所有出现?
E.g。
return query.Select(x => { x.SomePropertyName= x.SomePropertyName.Trim().Replace(' ', "_"); return x; }).ToList();
出于某种原因,当我需要替换多个字符时,上面的查询不会替换单个字符。
谢谢
答案 0 :(得分: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;
});
这会将'X'
,'Y'
或'Z'
替换为'_'
。您可以将其与您选择的循环结构相结合。
正如评论中所讨论的,在这种情况下使用Select
并没有真正添加任何值。一个普通的foreach
循环可以完成这项工作,甚至可以生成更紧凑的代码:
char[] unwanted = new[] {'X', 'Y', 'Z'};
foreach(var x in query)
{
x.SomePropertyName = string.Join("_", x.SomePropertyName.Split(unwanted));
};
答案 1 :(得分: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());
}
请注意,LINQ不是用于引起副作用,而是用于从现有的枚举中创建新的枚举。所以foreach
循环在这里更好。
但为什么不只是一连串的替换电话?
var result = query.ToList();
foreach (var x in result)
{
x.SomeProperty = x.SomeProperty
.Replace('X', '_')
.Replace('Y', '_')
.Replace('Z', '_')
.Replace(' ', '_');
}
或者您是否尝试用一系列字符替换单个字符? 然后使用带有两个字符串的String.Replace重载:
var result = query.ToList();
foreach (var x in result)
{
x.SomeProperty = x.SomeProperty.Replace(" ", "ABC");
}
答案 2 :(得分:2)
如果你想使用正则表达式,你可以这样做:
query.Select(
x => {
x.SomePropertyName = Regex.Replace(x.SomePropertyName, @"[XYZ\s]", "_");
return x; })
答案 3 :(得分:1)
虽然您请求LINQ,但LINQ的这种(ab)使用依赖于副作用并使代码混乱。与一组对象一起使用的替代方法(您在问题中说明的情况)是使用Array.ForEach method:
// using Fredrik Mörk's approach
Array.ForEach(query, x =>
x.SomePropertyName = string.Join("_", x.SomePropertyName.Split(unwanted)));
// using Regex
Array.ForEach(query, x => x.SomePropertyName =
Regex.Replace(x.SomePropertyName, "[XYZ]", "_", RegexOptions.IgnoreCase));
当然使用正则表达式需要一些知识。请注意使用在正则表达式中具有特殊含义的元字符。您可以使用Regex.Escape method来清理角色。
答案 4 :(得分:0)
循环遍历字符串中的每个字符,并在必要时替换它。
var xyz = new HashSet<char>(new[] { 'X', 'Y', 'Z' });
char replacement = '_';
var results = query
.Select(x =>
{
var value = x.SomePropertyName
.Trim()
.Select(y => xyz.Contains(y) ? replacement : y)
.ToArray();
x.SomePropertyName = new string(value);
return x;
})
.ToList();