Apakah string dalam array?

107

Apa cara terbaik untuk melihat di string[]untuk melihat apakah itu berisi elemen. Ini adalah kesempatan pertama saya. Tapi mungkin ada sesuatu yang saya abaikan. Ukuran larik tidak boleh lebih dari 200 elemen.

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

Jawaban:

210

Cukup gunakan metode Contains () yang sudah ada:

using System.Linq;

//...

string[] array = { "foo", "bar" };
if (array.Contains("foo")) {
    //...
}
Dave Markle
sumber
Untuk beberapa alasan ketika saya pertama kali mencari metode, saya tidak dapat menemukannya ... terima kasih.
Brad
4
@Brad: Itu karena ini adalah metode ekstensi yang berasal dari Enumerable.
AnthonyWJones
8
Sebagai satu kalimat:(new string[] { "foo", "bar" }).Contains("foo")
Denis V
8
Lebih pendek lagi:new[] { "foo", "bar" }.Contains(foo)
Eric Bole-Feysot
25

Saya tahu ini sudah lama, tetapi saya ingin pembaca baru mengetahui bahwa ada metode baru untuk melakukan ini menggunakan metode generik dan ekstensi.

Anda dapat membaca posting blog saya untuk melihat informasi lebih lanjut tentang bagaimana melakukan ini, tetapi ide utamanya adalah ini:

Dengan menambahkan metode ekstensi ini ke kode Anda:

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

Anda dapat melakukan pencarian seperti ini:

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

Ini berfungsi pada semua jenis (selama Anda membuat metode sama dengan yang baik). Jenis nilai apa pun pasti.

Gabriel McAdams
sumber
Saya memiliki sesuatu seperti ini var xxx = csvData.Rows[0].ItemArray[0].IsIn(".00", "0.0", ".25", "0.5", ".5", ".50", ".75");yang ingin saya lakukan adalah melihat siapa yang dapat dikategorikan di kolom pertama untuk melihat apakah nilai tidak berakhir di salah satu string berikut .. jika tidak maka saya ingin mengembalikan string yang menyatakan bahwa itu kehilangan nilai .00misalnya menggunakan contoh Anda.Saya tidak bisa mendapatkan yang ini untuk bekerja itu agak rumit karena saya tidak ingin mengembalikan bool Saya mengubah metode Anda untuk mengembalikan string tetapi masih tidak berfungsi saran apa pun
MethodMan
Ini tampaknya lebih baik diajukan sebagai pertanyaan di situs. Silakan dan rujuk jawaban ini jika perlu.
Gabriel McAdams
Saya benar-benar dapat menemukan cara yang luar biasa untuk melakukan apa yang ingin saya lakukan. Saya menulis sesuatu yang akan memeriksa apakah nilai string di dalam loop for untuk Datatables ItemArray, diakhiri dengan salah satu nilai berikut yang saya miliki di string public static bool EndWithValue(this string value, IEnumerable<string> values) { return values.Any(item => value.EndsWith(item)); }
MethodMan
12

Anda hanya setelah fungsi Array.Exists (atau metode ekstensi Berisi jika Anda menggunakan .NET 3.5, yang sedikit lebih nyaman).

Noldorin
sumber
3
Berikut adalah contoh yang berfungsi untuk .NET 2.0: if (Array.Exists (arrayToLookThrough, o => o == elementToSearchFor))
Dipicu
7

Linq (untuk s & g):

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

atau, tergantung pada kebutuhan

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

sumber
6

Apakah array sudah diurutkan? Jika demikian, Anda dapat melakukan pencarian biner . Berikut adalah implementasi NET juga. Jika larik diurutkan maka pencarian biner akan meningkatkan kinerja atas solusi iteratif apa pun.

Andrew Hare
sumber
2

Secara umum, array adalah struktur data yang buruk untuk digunakan jika Anda ingin bertanya apakah ada objek tertentu dalam koleksi atau tidak.

Jika Anda akan sering menjalankan pencarian ini, mungkin lebih baik menggunakan Dictionary<string, something>daripada menggunakan array. Pencarian dalam Dictionary adalah O (1) (waktu-konstan), sedangkan pencarian melalui array adalah O (N) (membutuhkan waktu yang sebanding dengan panjang array).

Meskipun lariknya paling banyak hanya 200 item, jika Anda melakukan banyak pencarian ini, Kamus kemungkinan akan lebih cepat.

Zack Elan
sumber
1
pencarian biner adalah O (log n); kamus subtends ke O (1) - tapi ada banyak overhead; untuk ukuran kecil hingga menengah, pencarian linier atau pencarian biner bisa lebih baik.
Marc Gravell
1

Anda juga dapat menggunakan LINQ untuk melakukan iterasi pada array. atau Anda dapat menggunakan metode Temukan yang membutuhkan delegasi untuk mencarinya. Namun saya pikir metode find sedikit lebih mahal daripada hanya perulangan.

masfenix.dll
sumber
Metode Find secara algoritme akan identik dengan metode "perulangan-melalui". Setiap biaya tambahan akan menjadi beberapa pembuatan objek dan mungkin satu atau dua lapisan tipuan tetapi, jika Anda khawatir tentang mengoptimalkannya dengan mengorbankan keterbacaan, Anda mengkhawatirkan hal-hal yang salah.
AwesomeTown
1

Seperti yang sering disebutkan di utas di atas, ini bergantung pada kerangka kerja yang digunakan. .Net Framework 3 dan yang lebih baru memiliki metode .Contains () atau Exists () untuk array. Untuk framework lain di bawah ini, bisa melakukan trik berikut daripada melakukan perulangan melalui array ...

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

Tidak terlalu yakin dengan efisiensi ... Dave

Dave
sumber
0

Ini lebih cepat daripada mengulang melalui larik secara manual:

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

        if (strArray.Contains(key))
            return true;
        return false;
    }
Chris Ballance
sumber
menggunakan LINQ lebih cepat daripada melakukan iterasi melalui string seperti yang dilakukan pada contoh. strArray.Contains (key) adalah semua yang benar-benar diperlukan
Chris Ballance
3
Di balik layar, strArray.Contains (key) hanya akan mengulang melalui array ... tidak ada keajaiban yang terlibat yang membuat Anda keluar dari melakukan pencarian O (n).
AwesomeTown
0

Jika Anda tidak ingin atau tidak bisa menggunakan LINQ Anda juga dapat menggunakan Array.Exists(...);fungsi statis :

https://msdn.microsoft.com/en-us/library/yw84x8be%28v=vs.110%29.aspx?f=255&MSPPError=-2147217396

var arr = new string[]{"bird","foo","cat","dog"};

var catInside = Array.Exists( 
  arr, // your Array
  (s)=>{ return s == "cat"; } // the Predicate
);

Ketika Predicate mengembalikan nilai true, catInside akan menjadi true juga.

mateiasu
sumber