Kiểm tra xem một mảng chuỗi có chứa một giá trị không và nếu có, có được vị trí của nó không


162

Tôi có mảng chuỗi này:

string[] stringArray = { "text1", "text2", "text3", "text4" };
string value = "text3";

Tôi muốn xác định nếu stringArrayvalue. Nếu vậy, tôi muốn xác định vị trí của nó trong mảng.

Tôi không muốn sử dụng các vòng lặp. Bất cứ ai có thể đề nghị làm thế nào tôi có thể làm điều này?

Câu trả lời:


316

Bạn có thể sử dụng phương thức Array.IndexOf :

string[] stringArray = { "text1", "text2", "text3", "text4" };
string value = "text3";
int pos = Array.IndexOf(stringArray, value);
if (pos > -1)
{
    // the array contains the string and the pos variable
    // will have its position in the array
}

1
... Và tôi đã sử dụng foreach trong nhiều tháng. BTW này có tính toán nhanh hơn câu trả lời của BLUEPIXY không? Hay chậm hơn?
Max von Hippel

2
Array.IndexOfquan tâm về vốn hóa? Có phải "text1" == "TEXT1"không?
EVIL

Array.IndexOf−1chỉ trả về nếu chỉ mục bị giới hạn 0. Trường hợp này sẽ phá vỡ, vì vậy hãy lưu ý! var a = Array.CreateInstance(typeof(int),new int[] { 2 }, new int[] { 1 }); a.SetValue(1, 1); Console.WriteLine(Array.IndexOf(a, 26)); // 0
benscabbia

Điều này hữu ích nếu bạn đang tìm kiếm một trận đấu chính xác. Tuy nhiên, điều này có thể hữu ích nếu bạn không quan tâm đến trường hợp: Cách thêm tùy chọn không phân biệt chữ hoa chữ thường vào Array.IndexOf
Kyle Champion

72
var index = Array.FindIndex(stringArray, x => x == value)

7
Đây phải là câu trả lời được chấp nhận vì nó cho phép một người vượt qua lambda để làm những việc phức tạp hơn như Array.Find Index (mảng, x => x.StartsWith ("chèn chuỗi ở đây"))
reggaeg Ức

1
Nhưng đó không phải là những gì câu hỏi đang yêu cầu. Câu hỏi hỏi làm thế nào để bạn tìm thấy một giá trị được biết đến từ một mảng.
Karl Gjertsen

2
@KarlGjertsen Tôi muốn xác định vị trí của nó trong mảng
BLUEPIXY

Điều này rất hữu ích mặc dù, việc có thể làm một cái gì đó như x.ToUpper () khá có lợi cho tôi.
mrshickadance

31

Chúng tôi cũng có thể sử dụng Exists:

string[] array = { "cat", "dog", "perl" };

// Use Array.Exists in different ways.
bool a = Array.Exists(array, element => element == "perl");
bool c = Array.Exists(array, element => element.StartsWith("d"));
bool d = Array.Exists(array, element => element.StartsWith("x"));

1
Câu trả lời đơn giản và
gọn gàng

Làm cách nào để kiểm tra các giá trị riêng lẻ? Khi tôi thử kiểm tra một mảng char cho char, tôi nhận được một tin nhắn charkhông thể chuyển đổi thànhSystem.Predicate<char>
Aaron Franke

13

EDIT: Tôi đã không nhận thấy bạn cũng cần vị trí này. Bạn không thể sử dụng IndexOftrực tiếp trên một giá trị của một kiểu mảng, bởi vì nó được triển khai rõ ràng. Tuy nhiên, bạn có thể sử dụng:

IList<string> arrayAsList = (IList<string>) stringArray;
int index = arrayAsList.IndexOf(value);
if (index != -1)
{
    ...
}

(Điều này tương tự như cách gọi Array.IndexOftheo câu trả lời của Darin - chỉ là một cách tiếp cận khác. Tôi không rõ tại sao được triển khai rõ ràng trong mảng, nhưng đừng bận tâm ...)IList<T>.IndexOf


Làm thế nào để tôi tìm thấy sự sở hữu của thế giới trong mảng bằng cách sử dụng Chứa?
MoShe

Có khả năng kiểm tra một mục chuỗi trong mảng chuỗi A tồn tại trong mảng chuỗi B khác không?
Murali Murugesan

@MuraliMurugesan: Không rõ bạn đang hỏi gì - liệu hai mảng có bất kỳ mục nào chung không? Một mặt hàng cụ thể ? (Trong trường hợp sau, thực tế là nó cũng nằm trong một mảng là không liên quan.)
Jon Skeet

Tôi đã cố gắng trả lời ở đây stackoverflow.com/a/22812525/1559213 . Tôi đã đánh lên để trả về true / false cho dòng Html.CheckBox. Trên thực tế có một mảng tháng và cũng là mô hình có một số tháng. Nếu tháng Model có mặt trong mảng tháng, chúng ta cần trả về true. Cảm ơn câu trả lời của tên lửa :)
Murali Murugesan

@MuraliMurugesan: Nghe có vẻ giốngif (months.Contains(model.Month))
Jon Skeet

5

Bạn có thể sử dụng Array.IndexOf()- lưu ý rằng nó sẽ trả về -1 nếu phần tử không được tìm thấy và bạn phải xử lý trường hợp này.

int index = Array.IndexOf(stringArray, value);

4

bạn có thể thử như thế này ... bạn có thể sử dụng Array.IndexOf (), nếu bạn cũng muốn biết vị trí

       string [] arr = {"One","Two","Three"};
       var target = "One";
       var results = Array.FindAll(arr, s => s.Equals(target));

3

IMO cách tốt nhất để kiểm tra xem một mảng có chứa giá trị đã cho hay không là sử dụng System.Collections.Generic.IList<T>.Contains(T item)phương thức theo cách sau:

((IList<string>)stringArray).Contains(value)

Mẫu mã hoàn chỉnh:

string[] stringArray = { "text1", "text2", "text3", "text4" };
string value = "text3";
if (((IList<string>)stringArray).Contains(value)) Console.WriteLine("The array contains "+value);
else Console.WriteLine("The given string was not found in array.");

T[]mảng riêng thực hiện một vài phương thức List<T>, chẳng hạn như Đếm và Chứa. Vì đó là một triển khai rõ ràng (riêng tư), bạn sẽ không thể sử dụng các phương thức này mà không cần truyền mảng trước. Điều này không chỉ hoạt động đối với các chuỗi - bạn có thể sử dụng thủ thuật này để kiểm tra xem một mảng thuộc bất kỳ loại nào có chứa bất kỳ phần tử nào không, miễn là lớp của phần tử thực hiện IComparable.

Hãy nhớ rằng không phải tất cả các IList<T>phương pháp đều hoạt động theo cách này. Cố gắng sử dụng IList<T>phương thức Add trên một mảng sẽ thất bại.


2
Về cơ bản, câu trả lời của bạn giống như của Priyank. Nó không đưa ra chỉ số của yếu tố đó là những gì OP yêu cầu.
reggaeg Ức

@reggaeg ỨNG Đồng ý với bạn đấy!
Si8

Đó là giải pháp tôi đang tìm kiếm, mặc dù nó không hoàn toàn trả lời câu hỏi.
Auspex

1

Bạn có thể thử cái này, nó tìm kiếm chỉ mục chứa phần tử này và nó đặt số chỉ mục là int, sau đó nó kiểm tra xem int có lớn hơn -1 không, vì vậy nếu nó 0 trở lên, thì có nghĩa là nó tìm thấy như vậy một chỉ mục - như các mảng dựa trên 0.

string[] Selection = {"First", "Second", "Third", "Fourth"};
string Valid = "Third";    // You can change this to a Console.ReadLine() to 
    //use user input 
int temp = Array.IndexOf(Selection, Valid); // it gets the index of 'Valid', 
                // in our case it's "Third"
            if (temp > -1)
                Console.WriteLine("Valid selection");
            }
            else
            {
                Console.WriteLine("Not a valid selection");
            }

0
string x ="Hi ,World";
string y = x;
char[] whitespace = new char[]{ ' ',\t'};          
string[] fooArray = y.Split(whitespace);  // now you have an array of 3 strings
y = String.Join(" ", fooArray);
string[] target = { "Hi", "World", "VW_Slep" };

for (int i = 0; i < target.Length; i++)
{
    string v = target[i];
    string results = Array.Find(fooArray, element => element.StartsWith(v, StringComparison.Ordinal));
    //
    if (results != null)
    { MessageBox.Show(results); }

}

0

Tôi đã tạo một phương thức mở rộng để sử dụng lại.

   public static bool InArray(this string str, string[] values)
    {
        if (Array.IndexOf(values, str) > -1)
            return true;

        return false;
    }

Cách gọi:

string[] stringArray = { "text1", "text2", "text3", "text4" };
string value = "text3";
if(value.InArray(stringArray))
{
  //do something
}

Đâu là positionrằng OP được yêu cầu?
Si8

-3
string[] strArray = { "text1", "text2", "text3", "text4" };
string value = "text3";

if(Array.contains(strArray , value))
{
    // Do something if the value is available in Array.
}

Nó báo lỗi: 'System.Array' không chứa định nghĩa cho 'chứa'.
ePandit

-4

Phương pháp đơn giản nhất và ngắn hơn sẽ là như sau.

string[] stringArray = { "text1", "text2", "text3", "text4" };
string value = "text3";

if(stringArray.Contains(value))
{
    // Do something if the value is available in Array.
}

3
Câu hỏi là về việc tìm vị trí của một mục trong một mảng .... Với Containsphương pháp bạn không có thông tin này
Bidou
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.