2012-05-06 17 views
1

這些天來,已經聽到ArrayList越來越陳舊了。但我有一個真正的情況下使用ArrayList,像這樣:如何在此處使用列表<T>代替ArrayList?

ArrayList GetArrayInt() 
    { 
     ArrayList l = new ArrayList(); 
     l.Add(2); 

     return l; 
    } 

    ArrayList GetArrayBool() 
    { 
     ArrayList l = new ArrayList(); 
     l.Add(true); 

     return l; 
    } 

    void Process(ArrayList l) 
    { 
     foreach (var o in l) 
     { 
      if (o is int) 
      { 

      } 
      else 
      { 

      } 
     } 
    } 

然後我打電話Process這樣的:

private void Form1_Load(object sender, EventArgs e) 
    { 
     Process(GetArrayInt()); 
     //or 
     Process(GetArrayBool()); 
    } 

底線是,我不需要寫兩個Process方法分別爲一個int和bools的ArrayList。

但我聽到有關ArrayLists的所有負面消息。所以我想用List<T>來實現它。這是我想出的:

List<bool> GetListBool() 
    { 
     var l = new List<bool>(); 
     l.Add(true); 

     return l; 
    } 

    List<int> GetListInt() 
    { 
     var l = new List<int>(); 
     l.Add(2); 

     return l; 
    } 

    void Process(List<object> l) 
    { 
     foreach (var o in l) 
     { 
      if (o is int) 
      { 

      } 
      else 
      { 

      } 
     } 
    } 

現在我該怎麼稱呼它?

private void Form1_Load(object sender, EventArgs e) 
    { 
     Process(GetListInt()); //error 
     Process(GetListBool()); //error 
     Process((List<object>)GetListBool()); //error 
    } 

這裏唯一的解決方案,我發現是編寫不同的Process方法List<bool>List<int>,然後將其兩個方法(我的實際代碼是一個複雜得多,所以要通過這種方法,我需要寫二十個Process所有做同樣的事情的方法)。

我該怎麼去寫一個Process方法在List<T>的方法?即使在這裏,List<T>也可以替換ArrayList嗎?

更新:所有三個答案的工作,但我喜歡@菲爾的回答最好。感謝所有

回答

1

正如馬克Gravell說,你做的是什麼奇怪的,但你可以使用類型推斷和使用Process<T>(IEnumerable<T>)如果你想:

void Main() 
{ 
    Process(GetInts()); 
    Process(GetBools()); 
} 

IEnumerable<int> GetInts() 
{ 
    return new List<int>{1,2,3}; 
} 

IEnumerable<bool> GetBools() 
{ 
    return new List<bool>{true, false, true}; 
} 

void Process<T>(IEnumerable<T> items) 
{ 
    foreach (var item in items) 
    { 
     if(item is int) 
     { 
      Debug.WriteLine("int: " + item.ToString()); 
     } 
     if(item is bool) 
     { 
      Debug.WriteLine("bool: " + item.ToString()); 
     } 
    } 
} 

不需要if(item is int)等將是更明智的方法具有工藝的過載對每種類型

void Process(IEnumerable<int> items) { foreach(...) }; 
void Process(IEnumerable<bool> items) { foreach(...) }; 
+0

很好的例子。這會在C#2.0中工作嗎? – nawfal

+0

此外,這裏有什麼奇怪的? – nawfal

+0

不,不是2.0,協方差是4.0以上。 – Phil

3

這是一個奇怪的例子,是不是很面向對象,但:你確實可以使用List<int>List<bool>,等等 - 和返回值類型/參數類型更改爲非通用IListIEnumerable。奇怪的例子,但。

+0

讓我看看。謝謝.. – nawfal

+0

看到我的要求,什麼是更多的OOP解決方案? – nawfal

1

您可以使用LINQ到一個類型安全的列表轉換爲List<object>

List<object> objList = GetListBool().Cast<object>().ToList(); 
相關問題