2012-02-07 23 views
7

相關:A list of multiple data types?在列表中存儲不同的類型?

我想知道如何在數組內存儲不同的數組類型(包括系統類型)。

上面的問題介紹瞭如何創建一個列表,只允許使用接口的用戶定義的類。但是如果我想要一個只接受雙打和字符串的列表呢?關於雙打和我寫的課程呢?怎麼樣一個列表,將只接受一個類寫和一個別人寫的類(所以我不能添加一個接口到第三方類,我認爲)。

我認爲使用List<object>,但我不知道這是否是公認的最佳做法。

+0

正如你可以告訴,我很新的C#。 – Michael0x2a 2012-02-07 22:11:58

+6

你爲什麼要這麼做?如果你認爲你有這種需求,那麼可能有更好的方法來處理你正在構建的東西。特別是如果類型之間沒有任何關係。 – 2012-02-07 22:15:09

+0

是的,但是如果我想要一個僅接受雙打和字符串的列表,而沒有別的呢? – Michael0x2a 2012-02-07 22:15:32

回答

4

您不僅可以指定自定義類型。 List<int>,List<double>,List<string>也適用。如果您需要存儲混合類型 - 您需要爲所有類型指定最接近的基類。在List<object>可以存儲任何類型的實例。

+0

但是,這將不允許您訪問數組內的類型的屬性。即如果您嘗試使用'List ',那麼您將其命名爲'List '以包含type1和type2。您將無法搜索List.FirstOrDefault(i => i.PropertyOfType1AndType2)'(假定type1&type2具有相似的屬性)。 – 2017-06-29 00:57:44

+0

@FranciscoSoto我認爲你是對的。如果您從頭開始編寫代碼,則不需要這樣做。編寫優質,深思熟慮的代碼非常重要。雖然有時候知道如何做一些骯髒的事情是很重要的,如果你需要做一些神奇的事情 - 例如爲了取悅顧客。 – 2017-06-29 17:34:26

2

您可以創建在其中實現Add()方法只接受雙打和字符串,就像一個自定義集合:

void Add(object toAdd) 
{ 
    if (toAdd is string) 
     // add into inner collection ... 
     ... (same for double) 
} 

不過,說實話,我真的想不出任何辦法你需要一個只接受這兩種類型的集合。你也許可以解決這個問題一些其他的方式...

1

你應該創建一個類

public class MyClass 
{ 
    public string x {get;set;} 
    public double y{get;set;} 
} 

然後,只需創建一個類的數組。這個類可以擁有任何你想要的類型,這就是面嚮對象語言中的對象的美妙之處。

public MyClass[] someList=new MyClass[insert_number_of_elements]; 
4

如果你願意放棄你可以使用一個ArrayList,它可以利用的東西預泛型列表的唯一途徑類型安全。

你可以在它周圍放一些包裝代碼,只接受雙打和字符串。

+0

你可以添加任何東西到一個ArrayList?例如,int,string,Person?你如何獲得元素?你必須施展它? – Loaderon 2016-09-24 15:13:35

1

你也可以使用?選項,列出以下類型:

public class MyClass 
{ 
    public string? x {get;set;} 
    public double? y {get;set;} 
} 

這樣,您可以選擇是否沒有,一個或兩個都可以有值。

或者,如果你不喜歡的HasValue /值功能:

public class MyClass 
{ 
    public enum EType { String, Double }; 

    EType TypeFilled {get; private set } 

    string _x; 
    public string X { get { return _x; }; set { _x = value; TypeFilled = EType.String; } 
    double y; 
    public double y { get { return _y; }; set { _y = value; TypeFilled = EType.Double; } 
} 

這樣的typeFilled屬性決定什麼被填滿。你可以添加驗證,以防止被設置兩次等。