Memeriksa apakah array string berisi nilai, dan jika demikian, dapatkan posisinya


162

Saya punya array string ini:

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

Saya ingin menentukan apakah stringArrayberisi value. Jika demikian, saya ingin mencari posisinya di array.

Saya tidak ingin menggunakan loop. Adakah yang bisa menyarankan bagaimana saya bisa melakukan ini?

Jawaban:


316

Anda bisa menggunakan metode 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
... Dan saya telah menggunakan foreach selama berbulan-bulan. BTW apakah komputasi ini lebih cepat dari jawaban BLUEPIXY? Atau lebih lambat?
— Max von Hippel

2
Apakah Array.IndexOfpeduli dengan kapitalisasi? Apakah itu "text1" == "TEXT1"?
— EVIL

Array.IndexOfmengembalikan −1hanya jika indeks dibatasi 0. Kasus ini akan pecah, jadi waspadalah! var a = Array.CreateInstance(typeof(int),new int[] { 2 }, new int[] { 1 }); a.SetValue(1, 1); Console.WriteLine(Array.IndexOf(a, 26)); // 0
— benscabbia

Ini berguna jika Anda mencari pasangan yang tepat. Namun, ini mungkin berguna jika Anda tidak peduli tentang kasus: Bagaimana cara menambahkan opsi case-insensitive ke Array.IndexOf
— Kyle Champion

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

7
Ini harus menjadi jawaban yang diterima karena memungkinkan seseorang untuk melewati lambda untuk melakukan hal-hal yang lebih rumit seperti Array.FindIndex (array, x => x.StartsWith ("masukkan string di sini"))
— reggaeguitar

1
Tapi bukan itu pertanyaannya. Pertanyaannya menanyakan bagaimana Anda menemukan nilai yang diketahui dari array.
— Karl Gjertsen

2
@KarlGjertsen Saya ingin mencari posisinya di array
— BLUEPIXY

Ini sangat berguna, bisa melakukan sesuatu seperti x.ToUpper () cukup bermanfaat bagi saya.
— mrshickadance

31

Kita juga bisa menggunakan 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
Jawaban bersih dan sederhana
— Aryan Firouzian

Bagaimana cara memeriksa nilai individual? Ketika saya mencoba memeriksa char array untuk char, saya mendapat pesan yang chartidak dapat dikonversi keSystem.Predicate<char>
— Aaron Franke

13

EDIT: Saya tidak memperhatikan Anda membutuhkan posisi itu juga. Anda tidak dapat menggunakan IndexOfsecara langsung pada nilai jenis array, karena itu diterapkan secara eksplisit. Namun, Anda dapat menggunakan:

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

(Hal ini mirip dengan memanggil Array.IndexOfsesuai jawaban Darin ini -. Hanya sebuah pendekatan alternatif Tidak jelas bagi saya mengapa ini dilaksanakan secara eksplisit dalam array, tetapi tidak pernah keberatan ...)IList<T>.IndexOf


bagaimana cara menemukan kepemilikan dunia dalam array menggunakan Contains?
— MoShe

Apakah ada kemungkinan untuk memeriksa item string dalam array string A yang ada di array string B lainnya?
— Murali Murugesan

@MuraliMurugesan: Tidak jelas apa yang Anda minta - apakah dua array memiliki setiap item kesamaan? Satu item spesifik ? (Dalam kasus terakhir, fakta bahwa array juga tidak relevan.)
— Jon Skeet

Saya mencoba menjawab di sini stackoverflow.com/a/22812525/1559213 . Saya memukul untuk mengembalikan true / false untuk baris Html.CheckBox. Sebenarnya ada array berbulan-bulan dan juga model yang memiliki beberapa bulan. Jika Model bulan hadir dalam array bulan, kita perlu mengembalikan true. Terima kasih atas respons roket :)
— Murali Murugesan

@MuraliMurugesan: Ya kedengarannya sepertiif (months.Contains(model.Month))
— Jon Skeet

5

Anda dapat menggunakan Array.IndexOf()- perhatikan bahwa ia akan mengembalikan -1 jika elemen belum ditemukan dan Anda harus menangani kasus ini.

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

4

Anda dapat mencoba seperti ini ... Anda dapat menggunakan Array.IndexOf (), jika Anda ingin mengetahui posisinya juga

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

3

IMO cara terbaik untuk memeriksa apakah array berisi nilai yang diberikan adalah dengan menggunakan System.Collections.Generic.IList<T>.Contains(T item)metode dengan cara berikut:

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

Contoh kode lengkap:

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[]array secara pribadi menerapkan beberapa metode List<T>, seperti Hitung dan Berisi. Karena ini merupakan implementasi (pribadi) yang eksplisit, Anda tidak akan dapat menggunakan metode ini tanpa terlebih dahulu menggunakan array. Ini tidak hanya berfungsi untuk string - Anda bisa menggunakan trik ini untuk memeriksa apakah array jenis apa pun mengandung elemen apa pun, selama kelas elemen mengimplementasikan IComparable.

Perlu diingat tidak semua IList<T>metode bekerja dengan cara ini. Mencoba menggunakan IList<T>metode Tambah pada larik akan gagal.


2
Jawaban Anda pada dasarnya sama dengan jawaban Priyank. Itu tidak memberikan indeks elemen yang diminta OP.
— reggaeguitar

@reggaeguitar Setuju dengan Anda di sana!
— Si8

Ini solusi yang saya cari, meskipun tidak sepenuhnya menjawab pertanyaan.
— Auspex

1

Anda dapat mencoba ini, mencari indeks yang mengandung elemen ini, dan menetapkan nomor indeks sebagai int, kemudian memeriksa apakah int lebih besar dari -1, jadi jika itu 0 atau lebih, maka itu berarti ditemukan seperti indeks - karena array adalah berbasis 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

Saya membuat metode ekstensi untuk digunakan kembali.

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

        return false;
    }

Bagaimana cara menyebutnya:

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

Di mana positionOP meminta?
— 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.
}

Ini memberikan kesalahan: 'System.Array' tidak mengandung definisi untuk 'berisi'.
— ePandit

-4

Metode paling sederhana dan lebih pendek adalah sebagai berikut.

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

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

3
Pertanyaannya adalah tentang menemukan posisi suatu item dalam sebuah array .... Dengan Containsmetode ini Anda tidak memiliki informasi ini
— Bidou
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.