2011-12-11 40 views
5

Ví dụ, tôi có trong ứng dụng của tôi một danh sách của một loại có tên người như tên của nó và giữ hai giá trị. Tên của loại là tên người và loại chỉ chứa tuổi của họ và số lượng std's.Cấu trúc dữ liệu tốt để sử dụng cho việc giữ hai giá trị là gì?

Ý tưởng đầu tiên của tôi là tạo một lớp Người có thuộc tính Độ tuổi và NumStds trong đó Yêu cầu tuổi và NumStds trong hàm tạo và tạo danh sách mà tôi có thể thêm vào.

class Person 
{ 
    public string Name { get; set; } 
    public int NumSTDs { get; set; } 
    public int Age { get; set; } 

    public Person(string name, int age, int stds) 
    { 
     Name = name; 
     Age = age; 
     NumSTDs = stds; 
    } 
} 

static void Main(string[] args) 
{ 
    List<Person> peoples = new List<Person>(); 
    peoples.Add(new Person("Julie", 23, 45)); 
} 

Tôi chỉ tự hỏi nếu có một cấu trúc dữ liệu mà tôi chỉ có thể đề cập đến các yếu tố trong Danh sách <> theo tên của họ và có tài sản gắn liền với họ đến cùng cho đi xe. Giống như tôi có thể nói

people.Remove(Julie) 
+2

Điều gì xảy ra nếu có hai người có cùng tên? – TrueWill

Trả lời

1

Hãy xem KeyedCollection<TKey, TValue> Class.

KeyedCollection < TKey, TValue > Lớp

Cung cấp các lớp cơ sở trừu tượng cho một bộ sưu tập mà các phím được nhúng trong các giá trị.

Bạn cần lấy được lớp bộ sưu tập của riêng mình từ lớp trừu tượng này, ví dụ:

class PersonCollection : KeyedCollection<string, Person> 
{ 
    protected override string GetKeyForItem(Person item) 
    { 
     return item.Name; 
    } 
} 

Ví dụ:

static void Main(string[] args) 
{ 
    var peoples = new PersonCollection(); 
    var julie = new Person("Julie", 23, 45) 
    peoples.Add(julie); 

    people.Remove(julie); 
    // - or - 
    people.Remove("Julie"); 
} 

Lưu ý rằng thuộc tính Name của lớp Person của bạn nên được thay đổi (read-only).

+0

Woo hoo !! Cảm ơn: D –

5

Có vẻ như bạn đang tìm kiếm Dictionary.

Dictionary<string, Person> peoples = new Dictionary<string, Person>(); 
Person oPerson = new Person("Julie", 23, 45); 
peoples.Add(oPerson.Name, oPerson); 

Tùy chọn khác là System.Collections.ObjectModel.KeyedCollection. Việc này cần nhiều công việc hơn một chút để thực hiện, nhưng có thể hữu ích.

Để thực hiện tác phẩm này, tạo ra một lớp bộ sưu tập cho người và ghi đè lên các phương pháp GetKeyForItem:

public class PersonCollection : System.Collections.ObjectModel.KeyedCollection<string, Person> 
{ 
    protected override string GetKeyForItem(Person item) 
    { 
     return item.Name; 
    } 
} 

Sau đó, bạn có thể thêm các mục vào bộ sưu tập như trong ví dụ của bạn:

PersonCollection peoples = new PersonCollection(); 
peoples.Add(new Person("Julie", 23, 45)); 

Sau đó, để xóa mục:

peoples.Remove("Julie"); 
1

Tôi không chắc chắn về các yêu cầu của bạn, nhưng chỉ cần nhìn vào câu lệnh Remove() ở cuối bài đăng của bạn, bạn có thể nhận được hiệu ứng tương tự với biểu thức LINQ.

people.Remove(p => string.Compare(p.Name, "Julia", true) == 0); 
+2

Sử dụng chuỗi.Equals() thay vì chuỗi.Compare() – slugster

0

Vấn đề với việc sử dụng Dictionary<string, Person> cho điều này là bạn có thể có khóa không khớp với tên của người đó. Điều này có thể tránh được, nhưng tôi muốn sử dụng một số HashSet<Person> cho công việc. Hiệu suất là như nhau.

Bạn chỉ cần chuẩn bị lớp học của mình bằng cách ghi đè GetHashCode để trả lại mã băm của Tên.

public override int GetHashCode() 
{ 
    return Name.GetHashCode(); 
} 
Các vấn đề liên quan