2012-11-07 29 views
5

Tôi đã tạo một vài lớp tùy chỉnh (NTDropDownNTBaseFreight) mà tôi sử dụng để lưu trữ dữ liệu mà tôi lấy từ một DB. Tôi khởi tạo Danh sách NTBaseFreight và 2 danh sách cho NTDropDown.list.add có vẻ như đang thêm một tham chiếu đến đối tượng gốc?

tôi thành công có thể sử dụng List.Add thêm cước vận chuyển vào danh sách giá cước, nhưng như tôi gỡ lỗi mã, 2 danh sách thả xuống của tôi chỉ chứa 1 NTDropDown, mà luôn luôn có giá trị giống như NTDropDown (Tôi giả định này là một tham khảo vấn đề, nhưng tôi đang làm gì sai)?

Để đưa ra một ví dụ, vào hàng thứ hai, nếu người vận chuyển và carrier_label"001", "MyTruckingCompany" và tôi đặt một break câu lệnh if cho frt_carriers, cả frt_carriers và frt_modes sẽ chỉ chứa 1 mục trong danh sách của họ, với các giá trị "001", "MyTruckingCompany" ... cùng giá trị trong NTDropDown.

Code:

List<NTDropDown> frt_carriers = new List<NTDropDown>(); 
List<NTDropDown> frt_modes = new List<NTDropDown>(); 
List<NTBaseFreight> freights = new List<NTBaseFreight>(); 
NTDropDown tempDropDown = new NTDropDown(); 
NTBaseFreight tempFreight = new NTBaseFreight(); 

//....Code to grab data from the DB...removed 

while (myReader.Read()) 
{ 
    tempFreight = readBaseFreight((IDataRecord)myReader); 

    //check if the carrier and mode are in the dropdown list (add them if not) 
    tempDropDown.value = tempFreight.carrier; 
    tempDropDown.label = tempFreight.carrier_label; 
    if (!frt_carriers.Contains(tempDropDown)) frt_carriers.Add(tempDropDown); 

    tempDropDown.value = tempFreight.mode; 
    tempDropDown.label = tempFreight.mode_label; 
    if (!frt_modes.Contains(tempDropDown)) frt_modes.Add(tempDropDown); 

    //Add the freight to the list 
    freights.Add(tempFreight); 
} 
+2

ok, tôi đã tìm ra ... Tôi cần khởi tạo NEW NTDropDown mỗi lần (không sử dụng lại tempDropDown nhiều lần). do đó, thêm 'tempDropDown = new NTDropDrop();' trước khi tôi sử dụng nó mỗi lần. Tôi có nên xóa câu hỏi này không? –

+0

Không. Để lại câu hỏi. Giải quyết câu hỏi của riêng bạn vẫn hữu ích cho mọi người. – hometoast

Trả lời

9

Có, danh sách các loại tham chiếu thực sự chỉ là danh sách tham chiếu.

Bạn phải tạo một phiên bản mới cho từng đối tượng mà bạn muốn lưu trữ trong danh sách.

Ngoài ra, phương pháp Contains so sánh các tham chiếu, do đó, hai đối tượng có chứa cùng một dữ liệu không được coi là bằng nhau. Tìm một giá trị trong thuộc tính của các đối tượng trong danh sách.

if (!frt_carriers.Any(c => c.label == tempFreight.carrier_label)) { 
    NTDropDown tempDropDown = new NTDropDown { 
    value = tempFreight.carrier, 
    label = tempFreight.carrier_label 
    }; 
    frt_carriers.Add(tempDropDown); 
} 
4

tempDropDown là cùng một đối tượng trong suốt toàn bộ vòng lặp. Bạn sẽ cần phải tạo một trường hợp mới của nó nếu bạn muốn thêm nhiều hơn một.

Tôi đang gặp khó khăn khi cố gắng tìm ra chính xác những gì bạn đang cố gắng thực hiện bằng cách thêm tempDropDown vào danh sách đó.

+0

Yea, tôi đã nhầm lẫn vì nó không gây ra vấn đề với đối tượng freights của tôi, nhưng đó là vì tôi đã nhận được một đối tượng mới mỗi lần lặp từ hàm readBaseFreight) ... –

+0

thành thật mà nói, đó không phải là ý tưởng của tôi .. Danh sách các phần thưởng được trả về trong JSON (nó sẽ được ứng dụng sử dụng) và tôi được yêu cầu tạo danh sách riêng cho tất cả các giá trị có thể cho mỗi nhà cung cấp/chế độ để người dùng có thể lọc kết quả hơn nữa (nếu họ muốn) ... với tôi, nó sẽ có ý nghĩa rằng danh sách các giá trị duy nhất sẽ được tạo ra bởi các ứng dụng ... Tôi chỉ cần trả lại danh sách các freights ... nhưng ... yeah ... –

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