2012-02-23 61 views
6

Tôi có mã này để thêm các mục đã chọn từ một số ListBox sang một mục khác. Làm cách nào để ngăn người dùng thêm mục hai lần? Tôi muốn ListBox họ đang thêm vào lstBoxToUserProjects để chỉ chứa các mục riêng biệt không có mục nhập trùng lặp.Ngăn các mục trùng lặp được thêm vào ListBox

protected void btnAddSelectedItem_Click(object sender, EventArgs e) 
{ 
    List<ListItem> itemsToAdd= new List<ListItem>(); 

    foreach (ListItem listItem in lstbxFromUserProjects.Items) 
    { 
     if (listItem.Selected) 
      itemsToAdd.Add(listItem); 
    } 

    foreach (ListItem listItem in itemsToAdd) 
    { 
     lstBoxToUserProjects.Items.Add(listItem); 
    } 
} 

EDIT: Đây là những gì tôi đã kết thúc bằng

protected void btnAddSelectedItem_Click(object sender, EventArgs e) 
{ 
    List<ListItem> itemsToAdd= new List<ListItem>(); 

    foreach (ListItem listItem in lstbxFromUserProjects.Items) 
    { 
     if (listItem.Selected) 
      itemsToAdd.Add(listItem); 
    } 

    foreach (ListItem listItem in itemsToAdd) 
    { 

     if (!lstBoxToUserProjects.Items.Contains(listItem)) 
     { 
      lstBoxToUserProjects.Items.Add(listItem); 
     } 
    } 
} 
+0

bạn đã xem xét việc sử dụng phương pháp Chứa vào danh sách để xem nếu nó đã có mặt? –

Trả lời

4

Nếu bạn gắn hộp danh sách lstBoxToUserProjects vào nguồn dữ liệu (HashSet) thì bạn có thể kiểm tra đơn giản xem mục được đề xuất lựa chọn đã có đích đến:

foreach(ListItem itemToAdd in itemsToAdd) 
{ 
    if (selectedItems.Contains(itemToAdd)) continue; 
    lstBoxToUserProjects.Items.Add(itemToAdd); 
} 

Lưu ý Tôi đang đề xuất HashSet vì bạn có thể kiểm tra hiệu suất trên tập hợp trong khi Danh sách sẽ được liệt kê để kiểm tra trận đấu.

0

Thay đổi itemsToAdd từ List để HashSet:

HashSet<ListItem> itemsToAdd= new HashSet<ListItem>(); 

... 
itemsToAdd.Add(listItem) // Adds only new items. 

Add MSDN:

Giá trị trả lại

Loại: Hệ thống.Boolean true nếu phần tử được thêm vào đối tượng HashSet (Of T) ; false nếu phần tử đã có. (gdoron- và không chèn phần tử nữa ...)

+0

Tôi không -1'ing câu trả lời của bạn, nhưng tôi nghĩ OP thực sự cần các mục trong 'ListBox' là duy nhất, không chỉ trong hành động thêm đơn lẻ. – Krizz

+0

@Krizz. **?!?! **. Nếu 'Add' không gây ra sự trùng lặp, nó sẽ xảy ra như thế nào? – gdoron

+0

Bạn có chắc 'ListBox.ObjectCollection.Add' không bảo đảm không trùng lặp? – Krizz

3

Bạn chỉ cần gọi ListBox.Items.Contains() trong câu lệnh if để kiểm tra xem nó đã được thêm chưa.

foreach (ListItem listItem in itemsToAdd) 
{ 
    if (!lstBoxToUserProjects.Items.Contains(listItem)) 
    { 
     lstBoxToUserProjects.Items.Add(listItem); 
    } 
} 
+0

Tại sao bạn không sửa định dạng thay vì xin lỗi vì nó? – Krizz

+0

Tôi không thể tìm ra cách điều chỉnh định dạng.Tôi sẽ tìm ra cách định dạng đúng cách khi tôi có nhiều thời gian hơn. – cain

+0

đã làm điều này cho bạn lần này, trong tương lai - chỉ thụt lề ít nhất 4 dấu cách. – Krizz

2

Hãy thử điều này:

protected void btnAddSelectedItem_Click(object sender, EventArgs e) 
{ 
    lstBoxToUserProjects.Items.AddRange(lstbxFromUserProjects.Items.Where(li => !lstBoxToUserProjects.Items.Contains(li)).ToArray()); 
} 

này giả C# 3.5, ít nhất.

0

Sử dụng

_items_Unique = _items.Distinct().ToList(); 

phương pháp nó nhanh chóng sau đó so sánh nơi _items_Unique và _items là danh sách hai

List<string> _items_Unique = new List<string>(); 
List<string> _items = new List<string>(); 
Các vấn đề liên quan