2010-06-25 75 views
11

Tôi đang đọc tên người dùng và sau đó kiểm tra xem có tồn tại trong bảng cơ sở dữ liệu khác không, vấn đề là khi tên người dùng giống với trường hợp có thể khác và ngăn không cho tìm kiếm và JSmith hoặc JSMITH.C# So sánh các chuỗi với trường hợp khác nhau

Làm cách nào để khắc phục sự cố này? Tôi có nên hạ thấp trường hợp khi ghi vào cơ sở dữ liệu đầu tiên hoặc tôi có thể thay đổi mã của mình bên dưới khi tôi so sánh hai mã này không?

drUser["Enrolled"] = 
    (enrolledUsers.FindIndex(x => x.Username == (string)drUser["Username"]) != -1); 

UPDATE:

vẫn phải vật lộn với điều này, các mã sau biên dịch nhưng không cho kết quả chính xác, khi xem người dùng đăng ký tôi thấy những người không đăng ký, khi xem những người mà không phải là đã đăng ký tôi thấy 1 đã được đăng ký nhưng trường hợp tên người dùng của họ giống nhau trong mỗi datababse. Tôi đã định dạng mã dưới đây chính xác chưa?

drUser["Enrolled"] = (enrolledUsers.FindIndex(x => x.Username.Equals((string)drUser["Username"], StringComparison.OrdinalIgnoreCase))); 

Cảm ơn Jamie

+1

Dang, tôi đã quá chậm. Nghĩ rằng nó sẽ là thích hợp cho tôi để trả lời này ..;) – jsmith

+0

@ jsmith: Cái gì? – SLaks

+1

@SLaks tên mẫu của anh ấy .. là tên người dùng của tôi .. :) – jsmith

Trả lời

21

Bạn cần Cal các Equals method, trong đó có một tham số StringComparison.

Ví dụ:

x.Username.Equals((string)drUser["Username"], StringComparison.OrdinalIgnoreCase) 

Nếu x.Username có thể null, bạn nên gọi static Equals method:

String.Equals(x.Username, (string)drUser["Username"], StringComparison.OrdinalIgnoreCase) 

Nếu không, x.Username.Equals có thể ném một NullReferenceException.

+0

Xin lỗi âm thanh dày nhưng mã bên dưới không hoạt động chính xác, nó biên dịch nhưng không tìm thấy người dùng phù hợp. drUser ["Enrolled"] = (enrollUsers.FindIndex (x => x.Username.Equals ((chuỗi) drUser ["Username"], StringComparison.OrdinalIgnoreCase))); – Jamie

+0

Chỉ cần thử cập nhật, và điều này không biên dịch. Tôi làm sai ở đâu? drUser ["Enrolled"] = (enrollUsers.FindIndex (String.Equals (x.Username, (string) drUser ["Username"], StringComparison.OrdinalIgnoreCase))); – Jamie

+0

Vui lòng chỉnh sửa câu hỏi của bạn và thêm mã chính xác của bạn. – SLaks

3

Cách ưa thích để làm điều này, là để xác định so sánh chuỗi bằng cách sử dụng một cái gì đó giống như

string.Equals(x.Username, (string)drUser["Username"], StringComparison.OrdinalIgnoreCase 

để làm việc kiểm tra bình đẳng, thay vì "=="

+0

Thao tác này sẽ không biên dịch (bạn quên truyền). – SLaks

+0

vị trí tốt - cảm ơn! –

0

Làm thế nào về việc sử dụng ToUpper() .

if(!(dr["Enrolled"] == null || dr["Username"] == null)) 
{ 
    if(dr["Enrolled"].ToString().ToUpperInvariant()== dr["Username"].ToString().ToUpperInvariant()) 
    { 
     //Do Something 
    } 
} 
+0

vui lòng cung cấp lý do bỏ phiếu xuống. Tôi muốn tìm hiểu lý do tại sao mã này là một thực tế xấu. Cảm ơn – MikeTWebb

+0

Tôi đã không downvote bạn, nhưng tôi có thể đoán tại sao. Thứ nhất, điều này sẽ phát nổ nếu một trong hai giá trị là null. Thứ hai, đây không phải là nhận thức về văn hóa. Nó có thể làm việc cho tiếng Anh (và rất nhiều ngôn ngữ khác nữa), nhưng không phải tất cả. Ví dụ được trích dẫn là "Trường hợp tiếng Thổ Nhĩ Kỳ": http://www.moserware.com/2008/02/does-your-code-pass-turkey-test.html .Net cung cấp cho bạn các so sánh chuỗi nhận biết văn hóa miễn phí - sử dụng chúng! –

+0

Xa ra .... cảm ơn lời giải thích. Nhiều đánh giá cao. Yeah, theo như NULLs .... ví dụ mã không được dự định là bằng chứng đạn. Tôi luôn kiểm tra NULL. – MikeTWebb

0

Bạn đã thử cái này chưa?

string userName = (string)drUser["Username"]; 
bool enrolled = enrolledUsers.Exists(x => 
    string.Equals(x.Name, userName, StringComparison.CurrentCultureIgnoreCase)); 

Có lý do nào bạn đang sử dụng FindIndex thay thế không?

0

thử phương thức string.compare. all overloads

Hoặc một nhiều specific one

Nếu không có gì khác, tôi hy vọng nó giáo dục.

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