2012-02-07 45 views
7

Liên quan: A list of multiple data types?Lưu trữ các loại khác nhau trong danh sách?

Tôi muốn biết cách lưu trữ các loại mảng khác nhau (bao gồm các loại hệ thống) bên trong một mảng.

Câu hỏi trên bao gồm cách tạo danh sách sẽ chỉ cho phép các lớp do người dùng xác định bằng cách sử dụng giao diện. Nhưng nếu tôi muốn một danh sách mà sẽ chỉ chấp nhận đôi và dây? Điều gì về đôi và một lớp tôi đã viết? Điều gì về một danh sách mà sẽ chỉ chấp nhận một lớp học đã viết và một lớp người khác đã viết (vì vậy tôi không thể thêm một giao diện cho lớp bên thứ 3, tôi nghĩ).

Tôi đã xem xét sử dụng List<object>, nhưng tôi không biết đó có phải là phương pháp hay nhất được chấp nhận hay không.

+0

Như bạn có thể biết, tôi khá mới đối với C#. – Michael0x2a

+6

Tại sao bạn muốn làm điều đó? Nếu bạn nghĩ rằng bạn có nhu cầu đó, có lẽ có một cách tốt hơn để tiếp cận những gì bạn đang xây dựng. Đặc biệt nếu các loại không có mối quan hệ nào giữa chúng. –

+0

Vâng, nhưng nếu tôi muốn một danh sách chỉ chấp nhận đôi và dây, và không có gì khác? – Michael0x2a

Trả lời

4

Bạn có thể chỉ định không chỉ các loại tùy chỉnh. List<int>, List<double>, List<string> cũng sẽ hoạt động. Nếu bạn cần lưu trữ các loại hỗn hợp - bạn cần chỉ định lớp cơ sở gần nhất cho tất cả các loại. Trong List<object> có thể được lưu trữ thể hiện của bất kỳ loại nào.

+0

Tuy nhiên, điều này sẽ không cho phép bạn truy cập các thuộc tính của các loại bên trong mảng. I E. Nếu bạn cố gắng có một 'Danh sách ' để bạn đặt tên nó là 'Danh sách 'để bao gồm type1 và type2. Bạn sẽ không thể tìm kiếm 'List.FirstOrDefault (i => i.PropertyOfType1AndType2)' (giả sử type1 & type2 có thuộc tính tương tự). –

+0

@FranciscoSoto Tôi nghĩ bạn đúng. Điều này không cần thiết nếu bạn viết mã của bạn từ đầu. Điều quan trọng là viết mã chất lượng, suy nghĩ tốt. Mặc dù đôi khi điều quan trọng là phải biết làm thế nào để làm một cái gì đó bẩn nếu bạn cần phải làm một số phép thuật - để làm hài lòng một khách hàng ví dụ. –

2

Bạn có thể tạo một bộ sưu tập tùy chỉnh mà bạn thực hiện phương thức Add() mà chỉ chấp nhận đôi và chuỗi, một cái gì đó như:

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

Nhưng, thành thật mà nói, tôi thực sự không thể nghĩ ra cách nào bạn sẽ cần một bộ sưu tập chỉ chấp nhận hai loại này. Bạn có lẽ có thể giải quyết vấn đề một số cách khác ...

1

Bạn nên tạo một lớp

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

Sau đó chỉ cần tạo một mảng của lớp đó. Lớp này có thể có bất kỳ loại nào bạn muốn, đó là vẻ đẹp của việc có các đối tượng trong một ngôn ngữ hướng đối tượng.

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

Nếu bạn sẵn sàng cho an toàn loại, bạn có thể sử dụng ArrayList, là cách duy nhất để sử dụng danh sách các loại thuốc generic.

Bạn có thể đặt một số mã bao bọc xung quanh nó để chỉ chấp nhận đôi và chuỗi.

+0

Bạn có thể thêm bất cứ thứ gì vào ArrayList không? Ví dụ, int, string, Person? Làm thế nào để bạn làm để có được một yếu tố? bạn phải bỏ nó? – Loaderon

1

Bạn cũng có thể sử dụng? tùy chọn, tạo danh sách loại sau:

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

Bằng cách này bạn có thể chọn nếu không, một hoặc cả hai có thể có giá trị.

Hoặc nếu bạn không thích các chức năng HasValue/Giá trị:

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

Bằng cách này, tài sản typeFilled quyết định những gì được làm đầy. Bạn có thể thêm xác nhận để tránh bị đặt hai lần, v.v.

Các vấn đề liên quan