Bagaimana saya bisa membuat Array. Berisi case-insensitive pada array string?

172

Saya menggunakan Array.Containsmetode pada array string. Bagaimana saya bisa membuat itu tidak sensitif huruf besar-kecil?

Mike Cole
sumber

Jawaban:

307
array.Contains("str", StringComparer.OrdinalIgnoreCase);

Atau tergantung pada keadaan tertentu, Anda mungkin lebih suka:

array.Contains("str", StringComparer.CurrentCultureIgnoreCase);
array.Contains("str", StringComparer.InvariantCultureIgnoreCase);
Mehrdad Afshari
sumber
4
Per msdn.microsoft.com/en-us/library/dd465121.aspx , "budaya invarian memiliki sangat sedikit properti yang membuatnya berguna untuk perbandingan." Di hampir semua kasus di mana Anda tidak menginginkan perbandingan khusus budaya ( CurrentCulture), Anda harus menggunakan Ordinaldaripada InvariantCulture.
bdukes
2
@bdukes Pernyataan itu terlalu kuat. Ada alasan yang sah untuk digunakan InvariantCulture. Penggunaan salah satu dari tiga pilihan di atas tergantung pada keadaan. Saya tidak keberatan dengan pemesanan ulang Anda, tetapi saya menghapus komentar "mungkin tidak". Sudah jelas dalam jawaban bahwa Anda harus memilih yang cocok untuk Anda dalam situasi saat ini.
Mehrdad Afshari
1
Butuh beberapa saat untuk menyadari bahwa Berisi adalah metode ekstensi di System.Linq.
Craig Celeste
LINQ untuk menyimpan hari lagi.
Bryantee
@MehrdadAfshari Dalam hal ini komentar sebelumnya benar-benar valid. "Berisi" hanya perlu memeriksa kesetaraan, yang lebih efisien dengan perbandingan Ordinal. Perbandingan "Budaya" sadar lainnya berkaitan dengan pemesanan karakter, dan karena itu hanya relevan untuk menyortir.
user1751825
9

Beberapa catatan penting dari pihak saya, atau setidaknya menaruh beberapa informasi yang didistribusikan di satu tempat - mengenai tip di atas dengan StringComparer seperti di:

if (array.Contains("str", StringComparer.OrdinalIgnoreCase))
{}
  1. array.Contains() adalah metode ekstensi LINQ dan karenanya hanya berfungsi dengan standar dengan .NET 3.5 atau lebih tinggi, membutuhkan:
    using System;
    using System.Linq;

  2. Tetapi: di .NET 2.0 Contains()metode sederhana (tanpa memperhitungkan kekurangan huruf besar-kecil) paling tidak mungkin seperti ini, dengan pemain:

    if ( ((IList<string>)mydotNet2Array).Contains(“str”) ) {}

    Karena metode Contains () adalah bagian dari antarmuka IList, ini berfungsi tidak hanya dengan array, tetapi juga dengan daftar, dll.

Philm
sumber
1

Menerapkan IEqualityComparer khusus yang memperhitungkan ketidakpekaan huruf besar-kecil.

Selain itu, periksa ini . Maka (secara teori) yang harus Anda lakukan adalah:

myArray.Contains("abc", ProjectionEqualityComparer<string>.Create(a => a.ToLower()))
Kon
sumber
18
Karena sampai 5 menit yang lalu saya tidak tahu ada StringComparer. :)
Kon
0
new[] { "ABC" }.Select(e => e.ToLower()).Contains("abc") // returns true
Darin Dimitrov
sumber
4
Tapi bukankah ini melakukan panggilan ToLower () yang mahal pada setiap item dalam daftar? String. Setara dengan kelebihan StringComparison akan lebih cocok dalam contoh ini.
Mike Cole