C#List <t>。.NET 2.0中的.ConvertAll </t>

时间:2009-12-22 20:30:43

标签: c# list delegates

我有一个字符串列表。所有字符串都有空格,需要转换为下划线。我完全有能力使用forforeach循环来执行此操作。我对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的奢侈。

2 个答案:

答案 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为目标。