Chuỗi có trong mảng không?


107

Cách tốt nhất để xem trong a string[]để xem nó có chứa một phần tử hay không. Đây là lần đầu tiên tôi chụp nó. Nhưng có lẽ có điều gì đó mà tôi đang bỏ qua. Kích thước mảng sẽ không lớn hơn 200 phần tử.

bool isStringInArray(string[] strArray, string key)
{
    for (int i = 0; i <= strArray.Length - 1; i++)
        if (strArray[i] == key)
            return true;
    return false;
}

Câu trả lời:


210

Chỉ cần sử dụng phương thức Contains () đã được tích hợp sẵn:

using System.Linq;

//...

string[] array = { "foo", "bar" };
if (array.Contains("foo")) {
    //...
}

Vì một số lý do khi tôi lần đầu tiên tìm kiếm phương pháp, tôi không thể tìm thấy nó ... cảm ơn.
Brad

4
@Brad: Đó là bởi vì nó là một phương thức mở rộng đến từ Enumerable.
AnthonyWJones

8
Là một lớp lót:(new string[] { "foo", "bar" }).Contains("foo")
Denis V

8
new[] { "foo", "bar" }.Contains(foo)
Ngắn

25

Tôi biết điều này là cũ, nhưng tôi muốn độc giả mới biết rằng có một phương pháp mới để thực hiện việc này bằng cách sử dụng các phương pháp chung và phương pháp mở rộng.

Bạn có thể đọc bài đăng trên blog của tôi để xem thêm thông tin về cách thực hiện việc này, nhưng ý tưởng chính là:

Bằng cách thêm phương thức tiện ích mở rộng này vào mã của bạn:

public static bool IsIn<T>(this T source, params T[] values)
{
    return values.Contains(source);
}

bạn có thể thực hiện tìm kiếm của mình như sau:

string myStr = "str3"; 
bool found = myStr.IsIn("str1", "str2", "str3", "str4");

Nó hoạt động trên mọi kiểu (miễn là bạn tạo một phương thức bằng tốt). Bất kỳ loại giá trị chắc chắn.


Tôi có một cái gì đó như thế này, var xxx = csvData.Rows[0].ItemArray[0].IsIn(".00", "0.0", ".25", "0.5", ".5", ".50", ".75");những gì tôi muốn làm là xem qua ai có thể lập dữ liệu trong cột đầu tiên để xem nếu các giá trị không kết thúc trong bất kỳ chuỗi nào sau đây .. nếu chúng không thì tôi muốn trả về một chuỗi nói rằng nó thiếu một giá trị, .00ví dụ bằng cách sử dụng ví dụ của bạn, tôi dường như không thể làm cho cái này hoạt động, nó phức tạp hơn một chút vì tôi không muốn trả về bool Tôi đã thay đổi phương thức của bạn để trả về một chuỗi nhưng vẫn không hoạt động bất kỳ đề xuất nào
MethodMan

Điều này có vẻ tốt hơn được đặt ra như một câu hỏi trên trang web. Hãy tiếp tục và tham khảo câu trả lời này nếu cần.
Gabriel McAdams

Tôi thực sự đã có thể nghĩ ra một cách tuyệt vời để làm những gì tôi muốn. Tôi đã viết một cái gì đó sẽ kiểm tra xem các giá trị của một chuỗi bên trong vòng lặp for cho Datatables ItemArray, kết thúc bằng bất kỳ giá trị nào sau đây mà tôi có trong string public static bool EndWithValue(this string value, IEnumerable<string> values) { return values.Any(item => value.EndsWith(item)); }
MethodMan

12

Bạn chỉ đơn giản là theo sau hàm Array.Exists (hoặc phương thức mở rộng Chứa nếu bạn đang sử dụng .NET 3.5, tiện lợi hơn một chút).


3
Dưới đây là một ví dụ làm việc cho .NET 2.0: if (Array.Exists (arrayToLookThrough, o => o == elementToSearchFor))
Fueled

7

Linq (dành cho s & g's):

var test = "This is the string I'm looking for";
var found = strArray.Any(x=>x == test);

hoặc, tùy thuộc vào yêu cầu

var found = strArray.Any(
    x=>x.Equals(test, StringComparison.OrdinalIgnoreCase));

6

Mảng có được sắp xếp không? Nếu vậy, bạn có thể thực hiện tìm kiếm nhị phân . Đây cũng là triển khai .NET. Nếu mảng được sắp xếp thì tìm kiếm nhị phân sẽ cải thiện hiệu suất so với bất kỳ giải pháp lặp lại nào.


2

Nói chung, mảng là một cấu trúc dữ liệu kém để sử dụng nếu bạn muốn hỏi một đối tượng cụ thể có nằm trong bộ sưu tập hay không.

Nếu bạn sẽ chạy tìm kiếm này thường xuyên, bạn nên sử dụng một Dictionary<string, something>mảng thay vì một mảng. Các tra cứu trong Từ điển là O (1) (thời gian không đổi), trong khi tìm kiếm trong mảng là O (N) (mất thời gian tỷ lệ với độ dài của mảng).

Ngay cả khi mảng chỉ có tối đa 200 mục, nếu bạn thực hiện nhiều tìm kiếm này, Từ điển có thể sẽ nhanh hơn.


1
tìm kiếm nhị phân là O (log n); từ điển phụ thuộc vào O (1) - nhưng có rất nhiều chi phí; đối với kích thước nhỏ đến trung bình, tìm kiếm tuyến tính hoặc tìm kiếm nhị phân có thể hoạt động tốt.
Marc Gravell

1

Bạn cũng có thể sử dụng LINQ để lặp qua mảng. hoặc bạn có thể sử dụng phương pháp Tìm để có một đại diện để tìm kiếm nó. Tuy nhiên, tôi nghĩ rằng phương pháp tìm kiếm đắt hơn một chút sau đó chỉ cần lặp lại.


Phương thức Tìm sẽ giống về mặt thuật toán với phương pháp "lặp qua". Bất kỳ chi phí bổ sung nào sẽ là một số tạo đối tượng và có thể là một hoặc hai lớp chuyển hướng, nhưng nếu bạn lo lắng về việc tối ưu hóa những thứ đó với chi phí dễ đọc, bạn đang lo lắng về những điều sai lầm.
AwesomeTown

1

Như đã đề cập nhiều lần trong chủ đề trên, nó phụ thuộc vào khuôn khổ đang sử dụng. .Net Framework 3 trở lên có các phương thức .Contains () hoặc Exists () cho mảng. Đối với các khung công tác khác bên dưới, có thể thực hiện thủ thuật sau thay vì lặp qua mảng ...

((IList<string>)"Your String Array Here").Contains("Your Search String Here")

Không quá chắc chắn về hiệu quả ... Dave


0

Điều này nhanh hơn so với việc lặp qua mảng theo cách thủ công:

static bool isStringInArray(string[] strArray, string key)
    {

        if (strArray.Contains(key))
            return true;
        return false;
    }

sử dụng LINQ nhanh hơn việc lặp qua chuỗi như đã được thực hiện trong ví dụ. strArray.Contains (key) là tất cả những gì là thực sự cần thiết
Chris Ballance

3
Đằng sau hậu trường, strArray.Contains (key) dù sao cũng sẽ lặp qua mảng ... không có phép thuật nào liên quan đến việc khiến bạn không thực hiện tìm kiếm O (n).
AwesomeTown

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.