Menggunakan C # untuk memeriksa apakah string berisi string dalam array string


290

Saya ingin menggunakan C # untuk memeriksa apakah nilai string berisi kata dalam array string. Sebagai contoh,

string stringToCheck = "text1text2text3";

string[] stringArray = { "text1", "someothertext", etc... };

if(stringToCheck.contains stringArray) //one of the items?
{

}

Bagaimana saya bisa memeriksa apakah nilai string untuk 'stringToCheck' berisi kata dalam array?


1
Blog ini menandai
Robert Harvey

Jawaban:


145

di sini adalah bagaimana Anda dapat melakukannya:

string stringToCheck = "text1";
string[] stringArray = { "text1", "testtest", "test1test2", "test2text1" };
foreach (string x in stringArray)
{
    if (stringToCheck.Contains(x))
    {
        // Process...
    }
}

UPDATE: Mungkin Anda mencari solusi yang lebih baik .. lihat jawaban @Anton Gogolev di bawah ini yang menggunakan LINQ.


3
Terima kasih, saya memodifikasi kode Anda menjadi: if (stringToCheck.Contains) dan berhasil.
Theomax

5
Saya lakukan jika (stringArray.Contains (stringToCheck)) dan berfungsi dengan baik, terima kasih.
Tamara JQ

68
Jangan gunakan jawaban ini sebagai gantinya gunakan LINQ
AlexC

11
Sedikit catatan untuk orang-orang yang tidak melihat metode Berisi pada array string: Periksa apakah Anda memiliki "menggunakan System.Linq;" namespace di codefile Anda :)
Sudhanshu Mishra

5
Linq tidak selalu tersedia dalam perangkat lunak lawas.
William Morrison

842

Begini caranya:

if(stringArray.Any(stringToCheck.Contains))
/* or a bit longer: (stringArray.Any(s => stringToCheck.Contains(s))) */

Ini memeriksa apakah stringToCheckberisi salah satu dari substring dari stringArray. Jika Anda ingin memastikan bahwa itu berisi semua substring, ubah Anyke All:

if(stringArray.All(stringToCheck.Contains))

115
Catatan untuk diri sendiri: LINQ luar biasa, LINQ luar biasa, LINQ luar biasa! Harus mulai menggunakan LINQ.
Fredrik Johansson

2
@Spooks Linq To Objects (yang digunakan dalam string-check jawaban) dapat digunakan melalui LinqBridge di .NET 2.0 albahari.com/nutshell/linqbridge.aspx
David Rettenbacher

1
bagaimana Anda melakukan ini dengan invarian kasus?
Pelayan

14
@Offler YaitustringArray.Any(s => s.IndexOf(stringToCheck, StringComparison.CurrentCultureIgnoreCase) > -1)
Anton Gogolev

2
bagaimana cara mendapatkan item dalam array yang cocok?
ibubi

44

Coba ini:

Tidak perlu menggunakan LINQ

if (Array.IndexOf(array, Value) >= 0)
{
    //Your stuff goes here
}

Bagus! Dan apa manfaat Linq mungkin memiliki lebih dari Array.IndexOf ??
Heckflosse_230

21
Ini sama sekali tidak menyelesaikan pertanyaan. IndexOf memberi tahu Anda jika sebuah array berisi kecocokan yang tepat untuk sebuah string, pertanyaan awal adalah apakah sebuah string berisi salah satu dari array string, yang ditangani Linq dengan mudah.
NetMage

Saya tahu komentar ini terlambat, tetapi hanya untuk mereka yang tidak tahu, string adalah array karakter sehingga tipe string memang mengandung metode IndexOf ... jadi @NetMage itu adalah solusi yang memungkinkan.
Blacky Wolf

3
@ Black Wolf, Apakah Anda membaca pertanyaan? Array.IndexOf memberi tahu Anda jika array berisi nilai, OP ingin tahu apakah suatu nilai mengandung anggota array, persis kebalikan dari jawaban ini. Anda bisa menggunakan String.IndexOf dengan Linq: stringArray.Any(w => stringToCheck.IndexOf(w) >= 0)tetapi jawaban Linq menggunakan String.Contains lebih masuk akal, karena itulah yang diminta.
NetMage

40

Cukup gunakan metode LINQ:

stringArray.Contains(stringToCheck)

4
Perhatikan, bahwa Contains adalah metode ekstensi dan yang perlu Anda lakukanusing System.Linq;
isHuman

11
Jawaban ini mundur dari pertanyaan.
NetMage

1
Bagaimana jawaban ini telah berkali-kali diangkat? 5 tahun setelah pertanyaan diajukan dan solusinya pada dasarnya terbalik dari apa yang ditanyakan.
Fus Ro Dah

1
mungkin hanya membalikkan nama variabel itu akan ok?
Jean-François Fabre

8

Cara termudah dan sampel.

  bool bol=Array.Exists(stringarray,E => E == stringtocheck);

lebih baik adalah stringarray.Exists (entitas => entitas == stringtocheck)
Marcel Grüger

Saya pikir Anda tidak bisa panggilan ada metode langsung dari array.Exists tali metode dapat digunakan secara langsung untuk daftar <T> Jadi harus menggunakan metode statis array.exist <T> string array.check di sini => msdn.microsoft.com/en- us / library / yw84x8be (v = vs.110) .aspx
Jze

6
string strName = "vernie";
string[] strNamesArray = { "roger", "vernie", "joel" };

if (strNamesArray.Any(x => x == strName))
{
   // do some action here if true...
}

2
Saya pikir ini bukan pertanyaan yang ditanyakan.
Pang

5

Sesuatu seperti ini mungkin:

string stringToCheck = "text1text2text3";
string[] stringArray = new string[] { "text1" };
if (Array.Exists<string>(stringArray, (Predicate<string>)delegate(string s) { 
    return stringToCheck.IndexOf(s, StringComparison.OrdinalIgnoreCase) > -1; })) {
    Console.WriteLine("Found!");
}

Ini adalah solusi yang lebih baik, karena ini adalah pemeriksaan substring terhadap kata-kata dalam daftar, bukan cek kecocokan yang tepat.
Roy B

Jawaban yang bagus, tapi wow itu sulit dibaca dibandingkan dengan C # modern bahkan tanpa Linq; juga, String.Containsmungkin lebih baik daripada String.IndexOfkecuali Anda ingin mengabaikan kasus, karena Microsoft lupa dua argumen String.ContainsAnda harus menulis sendiri. Pertimbangkan:Array.Exists(stringArray, s => stringToCheck.IndexOf(s, StringComparison.OrdinalIgnoreCase) > -1)
NetMage

3

Menggunakan Linq dan grup metode akan menjadi cara tercepat dan lebih ringkas untuk melakukan ini.

var arrayA = new[] {"element1", "element2"};
var arrayB = new[] {"element2", "element3"};
if (arrayB.Any(arrayA.Contains)) return true;

3

Anda dapat menentukan sendiri string.ContainsAny()dan string.ContainsAll()metode Anda. Sebagai bonus, saya bahkan menggunakan string.Contains()metode yang memungkinkan untuk perbandingan case-sensitive, dll.

public static class Extensions
{
    public static bool Contains(this string source, string value, StringComparison comp)
    {
        return source.IndexOf(value, comp) > -1;
    }

    public static bool ContainsAny(this string source, IEnumerable<string> values, StringComparison comp = StringComparison.CurrentCulture)
    {
        return values.Any(value => source.Contains(value, comp));
    }

    public static bool ContainsAll(this string source, IEnumerable<string> values, StringComparison comp = StringComparison.CurrentCulture)
    {
        return values.All(value => source.Contains(value, comp));
    }
}

Anda dapat menguji ini dengan kode berikut:

    public static void TestExtensions()
    {
        string[] searchTerms = { "FOO", "BAR" };
        string[] documents = {
            "Hello foo bar",
            "Hello foo",
            "Hello"
        };

        foreach (var document in documents)
        {
            Console.WriteLine("Testing: {0}", document);
            Console.WriteLine("ContainsAny: {0}", document.ContainsAny(searchTerms, StringComparison.OrdinalIgnoreCase));
            Console.WriteLine("ContainsAll: {0}", document.ContainsAll(searchTerms, StringComparison.OrdinalIgnoreCase));
            Console.WriteLine();
        }
    }

2

Saya menggunakan yang berikut ini di aplikasi konsol untuk memeriksa argumen

var sendmail = args.Any( o => o.ToLower() == "/sendmail=true");

2

Saya akan menggunakan Linq tetapi masih bisa dilakukan melalui:

new[] {"text1", "text2", "etc"}.Contains(ItemToFind);

1

Mencoba:

String[] val = { "helloword1", "orange", "grape", "pear" };
String sep = "";
string stringToCheck = "word1";

bool match = String.Join(sep,val).Contains(stringToCheck);
bool anothermatch = val.Any(s => s.Contains(stringToCheck));

1

Anda juga dapat melakukan hal yang sama seperti Anton Gogolev menyarankan untuk memeriksa apakah item dalam stringArray1pertandingan item di stringArray2:

if(stringArray1.Any(stringArray2.Contains))

Dan juga semua item di stringArray1 cocok dengan semua item di stringArray2:

if(stringArray1.All(stringArray2.Contains))


0

coba ini, berikut ini contohnya: Untuk memeriksa apakah bidang berisi salah satu kata dalam array. Untuk memeriksa apakah bidang (someField) berisi kata-kata dalam array.

String[] val = { "helloword1", "orange", "grape", "pear" };   

Expression<Func<Item, bool>> someFieldFilter = i => true;

someFieldFilter = i => val.Any(s => i.someField.Contains(s));

0
public bool ContainAnyOf(string word, string[] array) 
    {
        for (int i = 0; i < array.Length; i++)
        {
            if (word.Contains(array[i]))
            {
                return true;
            }
        }
        return false;
    }

0

Saya menggunakan metode yang mirip dengan IndexOf oleh Maitrey684 dan foreach loop dari Theomax untuk membuat ini. (Catatan: 3 "string" baris pertama hanyalah contoh bagaimana Anda bisa membuat array dan memasukkannya ke dalam format yang sesuai).

Jika Anda ingin membandingkan 2 array, mereka akan dibatasi semi-colon, tetapi nilai terakhir tidak akan memiliki satu setelahnya. Jika Anda menambahkan titik koma ke bentuk string dari array (yaitu a; b; c menjadi a; b; c;), Anda dapat mencocokkan menggunakan "x;" tidak peduli apa pun posisinya:

bool found = false;
string someString = "a-b-c";
string[] arrString = someString.Split('-');
string myStringArray = arrString.ToString() + ";";

foreach (string s in otherArray)
{
    if (myStringArray.IndexOf(s + ";") != -1) {
       found = true;
       break;
    }
}

if (found == true) { 
    // ....
}

0
string [] lines = {"text1", "text2", "etc"};

bool bFound = lines.Any(x => x == "Your string to be searched");

bFound disetel ke true jika string yang dicari cocok dengan elemen array 'garis' apa pun.


0

Coba ini

string stringToCheck = "text1text2text3";
string[] stringArray = new string[] { "text1" };

var t = lines.ToList().Find(c => c.Contains(stringToCheck));

Ini akan mengembalikan Anda baris dengan kejadian teks pertama yang Anda cari.


0

Jika stringArrayberisi sejumlah besar panjang string yang bervariasi, pertimbangkan untuk menggunakan Trie untuk menyimpan dan mencari larik string.

public static class Extensions
{
    public static bool ContainsAny(this string stringToCheck, IEnumerable<string> stringArray)
    {
        Trie trie = new Trie(stringArray);
        for (int i = 0; i < stringToCheck.Length; ++i)
        {
            if (trie.MatchesPrefix(stringToCheck.Substring(i)))
            {
                return true;
            }
        }

        return false;
    }
}

Ini adalah implementasi dari Triekelas

public class Trie
{
    public Trie(IEnumerable<string> words)
    {
        Root = new Node { Letter = '\0' };
        foreach (string word in words)
        {
            this.Insert(word);
        }
    }

    public bool MatchesPrefix(string sentence)
    {
        if (sentence == null)
        {
            return false;
        }

        Node current = Root;
        foreach (char letter in sentence)
        {
            if (current.Links.ContainsKey(letter))
            {
                current = current.Links[letter];
                if (current.IsWord)
                {
                    return true;
                }
            }
            else
            {
                return false;
            }
        }

        return false;
    }

    private void Insert(string word)
    {
        if (word == null)
        {
            throw new ArgumentNullException();
        }

        Node current = Root;
        foreach (char letter in word)
        {
            if (current.Links.ContainsKey(letter))
            {
                current = current.Links[letter];
            }
            else
            {
                Node newNode = new Node { Letter = letter };
                current.Links.Add(letter, newNode);
                current = newNode;
            }
        }

        current.IsWord = true;
    }

    private class Node
    {
        public char Letter;
        public SortedList<char, Node> Links = new SortedList<char, Node>();
        public bool IsWord;
    }

    private Node Root;
}

Jika semua string stringArraymemiliki panjang yang sama, Anda akan lebih baik hanya menggunakan HashSetaTrie

public static bool ContainsAny(this string stringToCheck, IEnumerable<string> stringArray)
{
    int stringLength = stringArray.First().Length;
    HashSet<string> stringSet = new HashSet<string>(stringArray);
    for (int i = 0; i < stringToCheck.Length - stringLength; ++i)
    {
        if (stringSet.Contains(stringToCheck.Substring(i, stringLength)))
        {
            return true;
        }
    }

    return false;
}

0

Solusi sederhana, tidak diperlukan linq apa pun

String.Join (",", array) .Berisi (Nilai + ",");


2
Bagaimana jika salah satu nilai dalam array berisi pembatas Anda?
Tyler Benzing

0
int result = Array.BinarySearch(list.ToArray(), typedString, StringComparer.OrdinalIgnoreCase);

0

Coba ini, tidak perlu loop ..

string stringToCheck = "text1";
List<string> stringList = new List<string>() { "text1", "someothertext", "etc.." };
if (stringList.Exists(o => stringToCheck.Contains(o)))
{

}

0

Untuk menyelesaikan jawaban di atas, untuk penggunaan cek IgnoreCase :

stringArray.Any(s => stringToCheck.IndexOf(s, StringComparison.CurrentCultureIgnoreCase) > -1)

Apakah ada cara untuk mendapatkan indeks pertandingan juga? Terima kasih.
Si8

0

Untuk kasus saya, jawaban di atas tidak berhasil. Saya sedang memeriksa string dalam sebuah array dan menugaskannya ke nilai boolean. Saya memodifikasi jawaban @Anton Gogolev dan menghapus Any()metode dan memasukkan bagian stringToCheckdalam Contains()metode.

bool = stringArray.Contains(stringToCheck);

0

Menggunakan metode Find atau FindIndex dari kelas Array :

if(Array.Find(stringArray, stringToCheck.Contains) != null) 
{ 
}
if(Array.FindIndex(stringArray, stringToCheck.Contains) != -1) 
{ 
}

-1

Saya menggunakan kode berikut untuk memeriksa apakah string berisi salah satu item dalam array string:

foreach (string s in stringArray)
{
    if (s != "")
    {
        if (stringToCheck.Contains(s))
        {
            Text = "matched";
        }
    }
}

3
Ini menetapkan Text = "matched"sebanyak yang stringToCheckmengandung substring dari stringArray. Anda mungkin ingin meletakkan breakatau returnsetelah penugasan.
Dour High Arch

-1

Tiga opsi diperagakan. Saya lebih suka menemukan yang ketiga sebagai yang paling ringkas.

class Program {
    static void Main(string[] args) {
    string req = "PUT";
    if ((new string[] {"PUT", "POST"}).Any(s => req.Contains(s))) {
        Console.WriteLine("one.1.A");  // IS TRUE
    }
    req = "XPUT";
    if ((new string[] {"PUT", "POST"}).Any(s => req.Contains(s))) {
        Console.WriteLine("one.1.B"); // IS TRUE
    }
    req = "PUTX";
    if ((new string[] {"PUT", "POST"}).Any(s => req.Contains(s))) {
        Console.WriteLine("one.1.C");  // IS TRUE
    }
    req = "UT";
    if ((new string[] {"PUT", "POST"}).Any(s => req.Contains(s))) {
        Console.WriteLine("one.1.D"); // false
    }
    req = "PU";
    if ((new string[] {"PUT", "POST"}).Any(s => req.Contains(s))) {
        Console.WriteLine("one.1.E"); // false
    }
    req = "POST";
    if ((new string[] {"PUT", "POST"}).Any(s => req.Contains(s))) {
        Console.WriteLine("two.1.A"); // IS TRUE
    }
    req = "ASD";
    if ((new string[] {"PUT", "POST"}).Any(s => req.Contains(s))) {
        Console.WriteLine("three.1.A");  // false
    }


    Console.WriteLine("-----");
    req = "PUT";
    if (Array.IndexOf((new string[] {"PUT", "POST"}), req) >= 0)  {
        Console.WriteLine("one.2.A"); // IS TRUE
    }
    req = "XPUT";
    if (Array.IndexOf((new string[] {"PUT", "POST"}), req) >= 0)  {
        Console.WriteLine("one.2.B"); // false
    }
    req = "PUTX";
    if (Array.IndexOf((new string[] {"PUT", "POST"}), req) >= 0)  {
        Console.WriteLine("one.2.C"); // false
    }
    req = "UT";
    if (Array.IndexOf((new string[] {"PUT", "POST"}), req) >= 0)  {
        Console.WriteLine("one.2.D"); // false
    }
    req = "PU";
    if (Array.IndexOf((new string[] {"PUT", "POST"}), req) >= 0)  {
        Console.WriteLine("one.2.E"); // false
    }
    req = "POST";
    if (Array.IndexOf((new string[] {"PUT", "POST"}), req) >= 0)  {
        Console.WriteLine("two.2.A");  // IS TRUE
    }
    req = "ASD";
    if (Array.IndexOf((new string[] {"PUT", "POST"}), req) >= 0)  {
        Console.WriteLine("three.2.A");  // false
    }

    Console.WriteLine("-----");
    req = "PUT";
    if ((new string[] {"PUT", "POST"}.Contains(req)))  {
        Console.WriteLine("one.3.A"); // IS TRUE
    }
    req = "XPUT";
    if ((new string[] {"PUT", "POST"}.Contains(req)))  {
        Console.WriteLine("one.3.B");  // false
    }
    req = "PUTX";
    if ((new string[] {"PUT", "POST"}.Contains(req)))  {
        Console.WriteLine("one.3.C");  // false
    }
    req = "UT";
    if ((new string[] {"PUT", "POST"}.Contains(req)))  {
        Console.WriteLine("one.3.D");  // false
    }
    req = "PU";
    if ((new string[] {"PUT", "POST"}.Contains(req)))  {
        Console.WriteLine("one.3.E");  // false
    }
    req = "POST";
    if ((new string[] {"PUT", "POST"}.Contains(req)))  {
        Console.WriteLine("two.3.A");  // IS TRUE
    }
    req = "ASD";
    if ((new string[] {"PUT", "POST"}.Contains(req)))  {
        Console.WriteLine("three.3.A");  // false
    }

    Console.ReadKey();
    }
}

Dua pilihan kedua Anda bahkan tidak melakukan hal yang sama pada yang pertama.
Kyle Delaney
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.