C # List <T>.ConvertAll в .NET 2.0 - PullRequest
       45

C # List <T>.ConvertAll в .NET 2.0

8 голосов
/ 22 декабря 2009

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

13 голосов
/ 22 декабря 2009

Вам необходимо присвоить результаты метода 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;
        }
));

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

List<String> convertedFieldList 
    = fieldList.ConvertAll<String>(delegate(String str) {
            return str.Trim().Replace(' ', '_');
        });
3 голосов
/ 22 декабря 2009

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.

...