2013-01-21 41 views
15
string[] lines3 = new string[100]; 
List<string> lines2 = new List<string>(); 
lines3 = Regex.Split(s1, @"\s*,\s*"); 

if (!lines2.Contains(lines3.ToString())) 
{ 
    lines2.AddRange(lines3.Distinct().ToArray()); 
} 

Tôi đã kiểm tra tất cả các không gian vv nhưng tôi vẫn nhận được các giá trị trùng lặp trong lines2 tôi ListTránh Thêm yếu tố trùng lặp vào một danh sách C#

tôi phải loại bỏ giá trị nhân bản của tôi ở đây bản thân

+0

lines2 là danh sách các chuỗi xin lỗi đã làm một lỗi nhỏ trong khi sao chép và dán mã – vini

+0

có thể có một khoảng trống giữa hai chuỗi như = SBC bgp – vini

+2

có bạn xem là sử dụng một HashSet thay vì Danh sách cho trường hợp này, nó sẽ hoạt động tốt hơn nhiều. – bashmohandes

Trả lời

18

này của bạn kiểm tra:

if (!lines2.Contains(lines3.ToString())) 

không hợp lệ. Bạn đang kiểm tra xem số lines2 của mình có chứa System.String[] kể từ lines3.ToString() sẽ cung cấp cho bạn điều đó không. Bạn cần kiểm tra xem mục từ lines3 có tồn tại ở lines2 hay không.

Bạn có thể lặp lại từng mục trong lines3 kiểm tra xem mục đó có tồn tại trong lines2 và sau đó thêm nó. Cái gì đó như.

foreach (string str in lines3) 
{ 
    if (!lines2.Contains(str)) 
     lines2.Add(str); 
} 

Hoặc nếu lines2 của bạn là bất kỳ danh sách rỗng, sau đó bạn chỉ có thể thêm các giá trị khác biệt lines3 vào danh sách như:

lines2.AddRange(lines3.Distinct()); 

sau đó bạn lines2 sẽ chứa giá trị khác biệt.

3

Nếu bạn không muốn bản sao trong danh sách, hãy sử dụng HashSet. Bằng cách đó nó sẽ được rõ ràng cho bất cứ ai khác đọc mã của bạn những gì ý định của bạn và bạn sẽ có ít mã để viết kể từ khi HashSet đã xử lý những gì bạn đang cố gắng để làm.

+1

cho những người xem xét băm cài đặt xin lưu ý rằng bạn không thể được đảm bảo đặt hàng – BKSpurgeon

1

Nếu séc của bạn đã hoạt động, nó sẽ có thể thêm tất cả các mục hoặc không có gì cả. Tuy nhiên, gọi phương thức ToString trên một mảng trả về tên của kiểu dữ liệu, không phải nội dung của mảng, và phương thức Contains chỉ có thể tìm kiếm một mục duy nhất, không phải là một tập hợp các mục.

Bạn phải kiểm tra mỗi chuỗi trong mảng:

string[] lines3; 
List<string> lines2 = new List<string>(); 

lines3 = Regex.Split(s1, @"\s*,\s*"); 

foreach (string s in lines3) { 
    if (!lines2.Contains(s)) { 
    lines2.Add(s); 
    } 
} 

Tuy nhiên, nếu bạn bắt đầu với một danh sách trống, bạn có thể sử dụng phương pháp Distinct để loại bỏ các bản sao, và bạn chỉ cần một dòng mã:

List<string> lines2 = Regex.Split(s1, @"\s*,\s*").Distinct().ToList(); 
23

Bạn có thể sử dụng Enumerable.Except để có được mục riêng biệt từ lines3 mà không có trong lines2:

lines2.AddRange(lines3.Except(lines2)); 

Nếu dòng 2 chứa tất cả các mục từ dòng 3 thì không có gì sẽ được thêm vào. BTW nội bộ Ngoại trừ sử dụng Set<string> để nhận các mục riêng biệt từ chuỗi thứ hai và để xác minh các mục đó có trong chuỗi đầu tiên. Vì vậy, nó khá nhanh.

1

Bạn có thể sử dụng một đơn giản Union + Distinct:

var lines = lines2.Union(lines3).Distinct(); 

Đó sẽ thêm tất cả các mục trong danh sách thứ hai vào danh sách đầu tiên, và sau đó trả lại tất cả các dây duy nhất trong danh sách cộng lại. Không có khả năng hoạt động tốt với các danh sách lớn, nhưng nó đơn giản.

tham khảo: http://msdn.microsoft.com/en-us/library/bb341731.aspx

1

Nếu bạn muốn lưu giá trị khác biệt vào một bộ sưu tập bạn có thể thử HashSet Class. Nó sẽ tự động loại bỏ các giá trị trùng lặp và tiết kiệm thời gian mã hóa của bạn. :)

19

Sử dụng một HashSet<string> thay vì một List<string>. Nó được chuẩn bị để thực hiện một hiệu suất tốt hơn bởi vì bạn không cần phải cung cấp séc cho bất kỳ mục nào. Bộ sưu tập sẽ quản lý nó cho bạn. Đó là sự khác biệt giữa số list và số set. Đối với mẫu:

HashSet<string> set = new HashSet<string>(); 

set.Add("a"); 
set.Add("a"); 
set.Add("b"); 
set.Add("c"); 
set.Add("b"); 
set.Add("c"); 
set.Add("a"); 
set.Add("d"); 
set.Add("e"); 
set.Add("e"); 

var total = set.Count; 

Tổng số là 5 và các giá trị là a, b, c, d, e.

Việc triển khai List<T> không cung cấp cho bạn nativelly. Bạn có thể làm điều đó, nhưng bạn phải cung cấp điều khiển này. Đối với mẫu, điều này extension method:

public static class CollectionExtensions 
{ 
    public static void AddItem<T>(this List<T> list, T item) 
    { 
     if (!list.Contains(item)) 
     { 
      list.Add(item); 
     } 
    } 
} 

và sử dụng nó:

var list = new List<string>(); 
list.AddItem(1); 
list.AddItem(2); 
list.AddItem(3); 
list.AddItem(2); 
list.AddItem(4); 
list.AddItem(5); 
+0

Hãy nhớ rằng 'HashSet' là không có thứ tự, có nghĩa là nó không giữ lại thứ tự các mục đã được thêm vào. Nếu anh ta cần giữ lại một thứ tự cụ thể, 'HashSet' sẽ không hoạt động. –

0

Sử dụng một HashSet cùng với bạn List:

List<string> myList = new List<string>(); 
HashSet<string> myHashSet = new HashSet<string>(); 

public void addToList(string s) { 
    if (myHashSet.Add(s)) { 
     myList.Add(s); 
    } 
} 

myHashSet.Add(s) sẽ trở lại true nếu s không tồn tại trong nó .

0

không phải là một cách tốt nhưng loại sửa chữa nhanh chóng, mất một bool để kiểm tra nếu trong toàn bộ danh sách có bất kỳ mục trùng lặp.

bool containsKey; 
string newKey; 

    public void addKey(string newKey){ 

     foreach(string key in MyKeys){ 
      if(key == newKey){ 
      containsKey = true; 
      } 
     } 

     if(!containsKey){ 
     MyKeys.add(newKey); 
    }else{ 
     containsKey = false; 
    } 

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