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?

Theomax
sumber
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.

Abdel Raoof
sumber
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))
Anton Gogolev
sumber
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
}
Maitrey684
sumber
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)
Legolas21
sumber
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);
Jze
sumber
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...
}
Vernie Namca
sumber
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!");
}
Fredrik Johansson
sumber
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;
Jun Zheng
sumber
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();
        }
    }
Kyle Delaney
sumber
2

Saya menggunakan yang berikut ini di aplikasi konsol untuk memeriksa argumen

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

Saya akan menggunakan Linq tetapi masih bisa dilakukan melalui:

new[] {"text1", "text2", "etc"}.Contains(ItemToFind);
CloudyMarble
sumber
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));
Valko
sumber
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))
Scotty.NET
sumber
1
stringArray.ToList().Contains(stringToCheck)
Christer Carlsson
sumber
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));
Vijay
sumber
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;
    }
nakisa
sumber
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) { 
    // ....
}
vapcguy
sumber
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.

Pabitra Dash
sumber
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.

Fernando Chávez
sumber
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;
}
tcb
sumber
0

Solusi sederhana, tidak diperlukan linq apa pun

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

pengguna5789849
sumber
2
Bagaimana jika salah satu nilai dalam array berisi pembatas Anda?
Tyler Benzing
0
int result = Array.BinarySearch(list.ToArray(), typedString, StringComparer.OrdinalIgnoreCase);
amit jha
sumber
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)))
{

}
Amjad Abu Saa
sumber
0

Untuk menyelesaikan jawaban di atas, untuk penggunaan cek IgnoreCase :

stringArray.Any(s => stringToCheck.IndexOf(s, StringComparison.CurrentCultureIgnoreCase) > -1)
Sirhan yang teduh
sumber
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);
Matthew Miranda
sumber
0

Menggunakan metode Find atau FindIndex dari kelas Array :

if(Array.Find(stringArray, stringToCheck.Contains) != null) 
{ 
}
if(Array.FindIndex(stringArray, stringToCheck.Contains) != -1) 
{ 
}
Andriy Tolstoy
sumber
-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";
        }
    }
}
Theomax
sumber
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();
    }
}
Steve
sumber
Dua pilihan kedua Anda bahkan tidak melakukan hal yang sama pada yang pertama.
Kyle Delaney