2012-10-25 33 views
8

Xin lỗi vì câu hỏi mới. ai đó có thể giúp tôi không? Mảng đơn giản ở đây. Phương pháp tốt nhất/dễ nhất để kiểm tra tất cả đầu vào của người dùng là duy nhất và không được sao chép? Cảm ơnLàm cách nào để kiểm tra các câu trả lời trùng lặp trong mảng này? C#

private void btnNext_Click(object sender, EventArgs e) 
    { 

     string[] Numbers = new string[5]; 


     Numbers[0] = txtNumber1.Text; 
     Numbers[1] = txtNumber2.Text; 
     Numbers[2] = txtNumber3.Text; 
     Numbers[3] = txtNumber4.Text; 
     Numbers[4] = txtNumber5.Text; 


     foreach (string Result in Numbers) 
     { 
      lbNumbers.Items.Add(Result); 
     } 

     txtNumber1.Clear(); 
     txtNumber2.Clear(); 
     txtNumber3.Clear(); 
     txtNumber4.Clear(); 
     txtNumber5.Clear(); 
    } 
} 

}

tôi nên đã thêm Tôi cần phải kiểm tra để xảy ra trước khi con số này là đầu ra. Cảm ơn

+0

Những câu trả lời dưới đây cho thấy bạn làm thế nào để kiểm tra sau khi bạn đã thêm chúng vào lbNumbers.Items. bạn cũng có thể kiểm tra khi bạn thêm chúng vào bạn foreach. –

Trả lời

15

Một phương pháp đơn giản là thông qua LINQ:

bool allUnique = Numbers.Distinct().Count() == Numbers.Length; 
+0

Xin chào. Tôi đã sử dụng nó và nó luôn trả về sai. Tôi đã sử dụng nó sai? – Rob

+0

Ý tôi là, tôi thiết lập điều này sau đó được thêm nếu (allUnique == true) sau đó nó sẽ hiển thị, nếu không thì nó bật lên một thông báo yêu cầu số duy nhất. Đây không phải là cách chính xác để sử dụng điều này? – Rob

+0

Tôi đã làm việc này. Cảm ơn bạn Jon. – Rob

1

Cách đơn giản nhất, theo ý kiến ​​của tôi, sẽ được chèn tất cả các giá trị bên trong một bộ và sau đó kiểm tra nếu kích thước của nó bằng với mảng của kích thước. Tập hợp không được chứa giá trị trùng lặp, vì vậy nếu bất kỳ giá trị nào trùng lặp, giá trị đó sẽ không được chèn vào tập hợp.

Điều này cũng OK khi phức tạp nếu bạn không có hàng triệu giá trị, vì việc chèn trong bộ được thực hiện trong thời gian O(logn), vì vậy tổng thời gian kiểm tra sẽ là O(nlogn).

Nếu bạn muốn một cái gì đó tối ưu về độ phức tạp, bạn có thể làm điều này trong O(n) thời gian bằng cách đi qua mảng, và đặt mỗi giá trị tìm thấy thành một bản đồ băm khi incrementing giá trị của nó: nếu giá trị không tồn tại trong bộ, bạn thêm nó với count = 1. Nếu nó tồn tại, bạn tăng số lượng của nó. Sau đó, bạn xem qua bản đồ băm và kiểm tra xem tất cả các giá trị có số lượng hay không.

2

cách tiếp cận khác là sử dụng một HashSet<string>:

var set = new HashSet<string>(Numbers); 
if (set.Count == Numbers.Count) 
{ 
    // all unique 
} 

hoặc với Enumerable.All:

var set = new HashSet<string>(); 
// HashSet.Add returns a bool if the item was added because it was unique 
bool allUnique = Numbers.All(text=> set.Add(text)); 

Enunmerable.All là hiệu quả hơn khi chuỗi là rất lớn vì nó không tạo ra các thiết lập hoàn toàn nhưng một sau lẫn nhau và sẽ trả về false ngay sau khi phát hiện trùng lặp.

Dưới đây là một bản demo của hiệu ứng này: http://ideone.com/G48CYv

  • HashSet tiêu thụ bộ nhớ constructor: 50 MB, thời gian: 00: 00: 00,2962615
  • Enumerable.All tiêu thụ bộ nhớ: 0 MB, thời gian: 00: 00: 00,0004254

MSDN

Các HashSet<T> lớp cung cấp các hoạt động thiết lập hiệu suất cao. Tập hợp là tập hợp không chứa các phần tử trùng lặp và có các phần tử không theo thứ tự cụ thể.

1

Nếu bạn đang cố gắng để đảm bảo rằng hộp danh sách của bạn không có dups sau đó sử dụng này:

if(!lbNumbers.Items.Contains(Result))  
    lbNumbers.Items.Add(Result); 
0

gì về điều này:

public bool arrayContainsDuplicates(string[] array) { 
    for (int i = 0; i < array.Length - 2; i++) { 
    for (int j = i + 1; j < array.Length - 1; j++) { 
     if (array[i] == array[j]) return true; 
    } 
    } 
    return false; 
} 
+0

Cảnh báo nếu có ai sử dụng mã này: kết quả của nó không hợp lệ và nỗ lực sửa của tôi đã bị từ chối (lý do được đưa ra: "chỉnh sửa của tôi lệch khỏi mục đích ban đầu của bài đăng. thay đổi nên cố gắng giữ gìn mục tiêu của chủ sở hữu bài đăng "). –

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