C# Список.ConvertAll in.NET 2.0

у меня есть список строк. Все строки имеют пробелы, которые необходимо преобразовать в подчеркивания. Я полностью способен использовать 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.

2 ответов


вам нужно назначить результаты 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;
        }
));

как Марк Gravell отмечает в комментарии ниже, вы можете упростить синтаксис этого выражения, делая это:

List<String> convertedFieldList 
    = fieldList.ConvertAll<String>(delegate(String str) {
            return str.Trim().Replace(' ', '_');
        });

ConvertAll не менять список. Он возвращает новый список, содержащий преобразованный материал. Кстати, вы можете удалить new Converter<string,string> С C# 2.0+:

List<string> converted = fieldList.ConvertAll<string>
    (delegate(string s) { return s.Trim().Replace(' ', '_'); });

кроме того, ничто не мешает вам использовать компилятор C# 3.0 и LINQBridge и целевой .NET 2.0.