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.