2011-06-08 43 views
2

任何人都可以幫助我弄清楚如何我可以簡化此代碼,而不使用ArrayList構建和使用通用列表?

List<Pair> material = new List<Pair>(); 
List<string> list = new List<string>(); 

string tempStr; 
int integer = -1; 
foreach (string s in ((string)Value).Split(new char[1] { ',' })) 
{ 
    if (int.TryParse(s, out integer)) 
    { 
    tempStr = NameValue.AllKeys[integer]; 

    if (someCondition == true) 
    { 
     material.Add(new Pair(tempStr, integer)); 
    } 
    else 
    { 
     list.Add(tempStr); 
    } 
    } 
} 
if(someCondition == true) 
{ 
    return material.ExtensionMethodForLists(); 
} 
else 
{ 
    return list.ExtensionMethodForLists(); 
} 

當我嘗試類似(下)時,我得到一個錯誤,沒有初始化一個implicitly型變量。

var list; 
if(someCondition == true) 
{ 
    list = new List<Pair>(); 
} 
else 
{ 
    list = new List<string>(); 
} 
+0

列表不能爲兩種不同的類型。 – alternative 2011-06-08 20:25:01

+0

@mathepic - 我不確定是否可以在這裏以某種方式使用泛型來幫助 – Brett 2011-06-08 20:25:30

+0

您需要這兩種類型來從通用接口/類型繼承。使用通用接口/基本類型將對和字符串換成類型。 – Maxim 2011-06-08 20:27:37

回答

6

如果使用的是不同類型的,你需要使用一個非泛型類型變量:

IList list; 
if(someCondition == true) 
{ 
    list = new List<Pair>(); 
} 
else 
{ 
    list = new List<string>(); 
} 

IList list = someCondition ? (IList)new List<Pair>() : new List<string>(); 

就個人而言,我不知道這是一個很棒的設計,但它滿足了這個要求。

+2

只有與非通用IList的麻煩是與它一起工作,因爲它離使用ArrayList不遠。 – KeithS 2011-06-08 20:28:21

+0

完全過度使用IList的想法,但你會有更好的設計建議嗎? – Brett 2011-06-08 20:28:48

+2

@KeithS - 不完全;你不能無意中在'List '中放置'Pair',儘管它被公開爲'IList' – 2011-06-08 20:29:52

0

如果您打算使用var,則必須立即分配值。否則,正如@Marc所說的是完美的......(好吧,正如他所說的 - 滿足要求)

0

就像在Python或其他動態類型語言中那樣。雖然如果你使用.net 4.0,你可以使用動態關鍵字而不是var。

但是,您使用的是C#,它意味着強類型化,動態關鍵字實際上是爲了與動態類型語言接口,如果類型系統正在發展,您應該重新考慮您的設計。另外,如果你真的需要管理兩種類型的集合,你應該將它包裝在一個類中,並隱藏客戶端代碼中的這些細節。

1

不知道這實際上簡化了,但這樣的:

public DataTable ParseToTable(string Value) 
    { 
     if (someCondition) 
      return ParseInternal<Pair>(Value, (s, i) => new Pair(s, i)); 
     else 
      return ParseInternal<string>(Value, (s, i) => s); 
    } 

    private DataTable ParseInternal<T>(string Value, Func<string,int,T> newItem) 
    { 
     List<T> list = new List<T>(); 

     string tempStr; 
     int integer = -1; 
     foreach (string s in ((string)Value).Split(new char[1] { ',' })) 
     { 
      if (int.TryParse(s, out integer)) 
      { 
       tempStr = NameValue.AllKeys[integer]; 
       list.Add(newItem(tempStr, integer)); 
      } 
     } 
     return list.ExtensionMethodForLists(); 
    }