2009-12-22 52 views
8

我有一個字符串列表。所有字符串都有需要轉換爲下劃線的空白。我完全可以使用forforeach循環來執行此操作。我對C#還比較陌生,並希望對它更熟悉。這就是說,我的問題是:C#List <T> .ConvertAll在.NET 2.0中

我怎樣才能得到下面的代碼在.NET 2.0中工作?當我在ConvertAll操作結束時檢查fieldList時,沒有任何變化。通過值而不是引用傳遞字符串是否存在問題?

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和Lambda表達式的奢侈品。

回答

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; 
     } 
)); 

正如馬克Gravell在下面評論指出,可以簡化這種表達的由這樣的語法:

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

只是爲了保持完整性,您可以簡化爲'... ConvertAll (委託(字符串str){...});' –

+0

@Marc - 良好的指出:) –

+0

我得到這個錯誤: 類型無法根據用法推斷方法'System.Collections.Generic.List.ConvertAll(System.Converter)'的參數。嘗試明確指定類型參數。 – kzh

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。

+0

由於某些原因,C#2.0無法在沒有新的Converter聲明的情況下推斷該類型。 – kzh