我有一个字符串列表。所有字符串都有空格,需要转换为下划线。我完全有能力使用for
或foreach
循环来执行此操作。我对C#还是比较新的,并希望对它更加熟悉。话虽如此,我的问题是:
如何在.NET 2.0中使用以下代码?当我在fieldList
操作结束时检查ConvertAll
时,没有任何变化。是否存在按值而不是引用传递字符串的问题?
string fields =
"First Name,Middle Name,Last Name,Birth Date,Gender,Address,City,State,Zip,Email";
List<string> fieldList = new List<string>(fields.Split(','));
fieldList.ConvertAll<string>(new Converter<string, string>(
delegate(string str)
{
str = str.Trim();
str = str.Replace(' ', '_');
return str;
}
));
请记住,我使用的是.NET 2.0,目前无法切换,所以我没有使用LINQ或Lambdas的奢侈。
答案 0 :(得分:13)
您需要将ConvertAll
方法的结果分配给变量,如下所示:
fieldList = fieldList.ConvertAll<string>(new Converter<string, string>(
delegate(string str)
{
str = str.Trim();
str = str.Replace(' ', '_');
return str;
}
));
ConvertAll
方法返回一个新的List<T>
,因此您需要指定方法的结果。如果您想重新使用fieldList
变量,可能最好创建一个新变量以提高代码的清晰度:
List<String> convertedFieldList
= fieldList.ConvertAll<string>(new Converter<string, string>(
delegate(string str)
{
str = str.Trim();
str = str.Replace(' ', '_');
return str;
}
));
正如Marc Gravell在下面的评论中指出的那样,你可以通过这样做简化这个表达式的语法:
List<String> convertedFieldList
= fieldList.ConvertAll<String>(delegate(String str) {
return str.Trim().Replace(' ', '_');
});
答案 1 :(得分:3)
ConvertAll
不会更改输入列表。它返回一个包含转换后的东西的新列表。顺便说一下,您可以使用C#2.0 +删除new Converter<string,string>
:
List<string> converted = fieldList.ConvertAll<string>
(delegate(string s) { return s.Trim().Replace(' ', '_'); });
此外,没有什么可以阻止您使用C#3.0编译器和LINQBridge并以.NET 2.0为目标。