কোনও স্ট্রিংয়ে কিছু স্ট্রিং রয়েছে কিনা তা কীভাবে পরীক্ষা করবেন


101

আমি যাচাই করতে চাই যে কোনও স্ট্রিং এস, সি # তে "ক" বা "বি" বা "সি" রয়েছে কিনা। আমি ব্যবহারের চেয়ে ভাল সমাধান খুঁজছি

if (s.contains("a")||s.contains("b")||s.contains("c"))

4
জটিল ক্ষেত্রে trieডেটা কাঠামো সন্ধান করুন।
— দুর্ভেদ্য পরিবর্তনশীল

উত্তর:


45

আপনি যদি একক অক্ষর সন্ধান করছেন, আপনি ব্যবহার করতে পারেন String.IndexOfAny()।

আপনি যদি স্বেচ্ছাসেবী স্ট্রিং চান, তবে আমি সেই "সরাসরি" অর্জনের জন্য নেট নেট পদ্ধতি সম্পর্কে অবগত নই, যদিও নিয়মিত প্রকাশ কাজ করবে।


97

ঠিক আছে, এটি সবসময় আছে:

public static bool ContainsAny(this string haystack, params string[] needles)
{
    foreach (string needle in needles)
    {
        if (haystack.Contains(needle))
            return true;
    }

    return false;
}

ব্যবহার:

bool anyLuck = s.ContainsAny("a", "b", "c");

||যাইহোক, আপনার তুলনা শৃঙ্খলের পারফরম্যান্সের সাথে কোনও মিলছে না ।


14
এই দুর্দান্ত সমাধানটিতে নতুন সংক্ষিপ্ত বাক্য গঠন যুক্ত করা হচ্ছে public static bool ContainsAny(this string haystack, params string[] needles) { return needles.Any(haystack.Contains); }
— সিমোনক্যাস্পার্স 1

সহজ এবং সুস্পষ্ট সমাধান। কিন্তু বাস্তবায়ন ব্যবহারের জন্য এমন কোনও ভাল প্রস্তুত আছে যা খড়ের ছিদ্রের স্ট্রিংয়ের মাধ্যমে একাধিক পুনরাবৃত্তির প্রয়োজন নেই? আমি নিজেই এটি প্রয়োগ করতে পারি, খড়ের স্ট্রিং অক্ষরগুলির মাধ্যমে পুনরাবৃত্তি করতে এবং সূচির প্রথম অক্ষরগুলিকে একযোগে পর্যায়ক্রমে তুলনা করতে পারি, তবে আমি বিশ্বাস করতে পারি না যে এইরকম তুচ্ছ সমাধান এখনও কিছু সুপরিচিত নুগেট লাইব্রেরিতে প্রয়োগ করা হয়নি।
— রোলারকস্টার

@ রোলারকোস্টার এটি সি # তে নির্মিত হয়নি (এখনও) তাই এত সহজ সমাধানের জন্য আপনার প্রকল্পে অতিরিক্ত নির্ভরতা যুক্ত করবেন কেন?
— জেএমডন

74

এখানে একটি লিনকিউ সমাধান রয়েছে যা কার্যত একই তবে আরও স্কেলযোগ্য:

new[] { "a", "b", "c" }.Any(c => s.Contains(c))

4
এটি এই অর্থে স্কেলেবল যে পারফরম্যান্সের অর্থে নয়, চরিত্র যুক্ত করা সহজ ... :)
— গুফা

4
হ্যাঁ, অবশ্যই সম্ভবত "আরও এক্সটেনসিবল" শব্দগুলির একটি ভাল পছন্দ হতে পারে।
— জেফ মার্কাডো

পারফরম্যান্স ভয়ানক হবে না। যেভাবেই হোক একটি ব্যাখ্যা করা রেজিএক্সপ্যাকের চেয়ে ভাল।
— স্টিভেন সুদিত

সম্পূর্ণতার জন্য দুর্দান্ত উত্তর আপনি আপনার আগত স্ট্রিংটিকে প্রথমে অ্যারেতে ভাগ করতে পারেন যেমন: var splitStringArray = someString.Split (''); তারপরে আপনি এর মতো কিছু করতে পারেন: যদি (someStringArray.Any (s => otherString.Contains (s)) {// কিছু করুন} আশা করি যে কাউকে স্পষ্টতার জন্য সহায়তা করে।
— তাহির খালিদ


21

আপনি নিয়মিত অভিব্যক্তি দিয়ে চেষ্টা করতে পারেন

string s;
Regex r = new Regex ("a|b|c");
bool containsAny = r.IsMatch (s);

4
+1, যদিও যেহেতু তিনি একক অক্ষরগুলি সন্ধান করছেন একটি লিঙ্ক সমাধান বা সূচিপত্র যে কোনও আরও দক্ষ হতে পারে।
— জোয়েল কোহোর্ন

নিয়মিত প্রকাশের জন্য +1। যে কি আমি, জন্য সর্বস্বান্ত হবে যদি IndexOfAny ছিল না
— Stavros

4
নিয়মিত প্রকাশগুলি এর জন্য ওভারকিল হয়।
— স্টিভেন সুদিত

4
লোকেরা কী বলে যে রেজেক্সসগুলি এর জন্য ওভারকিল হয়? যদি রেজেক্স একবার সংকলিত হয় এবং একাধিকবার ব্যবহৃত হয়, এবং আপনার কেবল তার সাথে সি থাকে বা শুরুতে সি এবং এ, বি এর শেষের কাছাকাছি থাকে তবে রেজেক্স আরও কার্যকর হবে।
— ব্রুসবেটন

এটি -, '' এর মতো বিশেষ চরিত্রগুলির জন্য কাজ
— করেনি

15

আপনার যদি সুনির্দিষ্ট StringComparison(উদাহরণস্বরূপ কেস উপেক্ষা করা) সহ কনটেনসএই দরকার হয় তবে আপনি এই স্ট্রিং এক্সটেনশন পদ্ধতি ব্যবহার করতে পারেন।

public static class StringExtensions
{
    public static bool ContainsAny(this string input, IEnumerable<string> containsKeywords, StringComparison comparisonType)
    {
        return containsKeywords.Any(keyword => input.IndexOf(keyword, comparisonType) >= 0);
    }
}

এর সাথে ব্যবহার StringComparison.CurrentCultureIgnoreCase:

var input = "My STRING contains Many Substrings";
var substrings = new[] {"string", "many substrings", "not containing this string" };
input.ContainsAny(substrings, StringComparison.CurrentCultureIgnoreCase);
// The statement above returns true.

”xyz”.ContainsAny(substrings, StringComparison.CurrentCultureIgnoreCase);
// This statement returns false.

4
এই উত্তরটি উন্নত করতে কেবল একটি নোট আপনি এটিকে আরও প্যারাম কীওয়ার্ড সহ আরও মার্জিত লিখতে পারেন: ContainsAny (এই স্ট্রিং ইনপুট, স্ট্রিংকম্পেরেশন তুলনা টাইপ, প্যারাম স্ট্রিং [] রয়েছে কীওয়ার্ডস) এবং ইনপুট এর মত ব্যবহার করুন ont ইত্যাদি)
— রোমা বোরোডভ

8

এটি একটি "সুন্দর সমাধান" এবং বেশ সহজ

if(new string[] { "A", "B", ... }.Any(s=>myString.Contains(s)))

4

স্ট্রিং অক্ষরগুলির সংগ্রহ হিসাবে আপনি তাদের উপর লিনকিউ এক্সটেনশন পদ্ধতি ব্যবহার করতে পারেন:

if (s.Any(c => c == 'a' || c == 'b' || c == 'c')) ...

এটি একবারে স্ট্রিংটি স্ক্যান করবে এবং ম্যাচ না পাওয়া পর্যন্ত প্রতিটি চরিত্রের জন্য একবার স্ট্রিং স্ক্যান না করে প্রথম বারের দিকে থামবে।

এটি আপনার পছন্দ মত যে কোনও মত প্রকাশের জন্যও ব্যবহার করা যেতে পারে, উদাহরণস্বরূপ বিভিন্ন অক্ষরের জন্য পরীক্ষা করা:

if (s.Any(c => c >= 'a' && c <= 'c')) ...

রাজি। যখন প্রথম শর্ত মেলে না এটি একাধিক স্ক্যানের সমস্যা সমাধান করে। ভাবছি ল্যাম্বদার ওভারহেডটি কি তবে? একবার হলেও বেশি হওয়া উচিত নয়।
— ব্রুসবেটন

4
public static bool ContainsAny(this string haystack, IEnumerable<string> needles)
{
    return needles.Any(haystack.Contains);
}


2
// Nice method's name, @Dan Tao

public static bool ContainsAny(this string value, params string[] params)
{
    return params.Any(p => value.Compare(p) > 0);
    // or
    return params.Any(p => value.Contains(p));
}

Anyযে কোনও Allজন্য, প্রত্যেকের জন্য


2
    static void Main(string[] args)
    {
        string illegalCharacters = "!@#$%^&*()\\/{}|<>,.~`?"; //We'll call these the bad guys
        string goodUserName = "John Wesson";                   //This is a good guy. We know it. We can see it!
                                                               //But what if we want the program to make sure?
        string badUserName = "*_Wesson*_John!?";                //We can see this has one of the bad guys. Underscores not restricted.

        Console.WriteLine("goodUserName " + goodUserName +
            (!HasWantedCharacters(goodUserName, illegalCharacters) ?
            " contains no illegal characters and is valid" :      //This line is the expected result
            " contains one or more illegal characters and is invalid"));
        string captured = "";
        Console.WriteLine("badUserName " + badUserName +
            (!HasWantedCharacters(badUserName, illegalCharacters, out captured) ?
            " contains no illegal characters and is valid" :
            //We can expect this line to print and show us the bad ones
            " is invalid and contains the following illegal characters: " + captured));  

    }

    //Takes a string to check for the presence of one or more of the wanted characters within a string
    //As soon as one of the wanted characters is encountered, return true
    //This is useful if a character is required, but NOT if a specific frequency is needed
    //ie. you wouldn't use this to validate an email address
    //but could use it to make sure a username is only alphanumeric
    static bool HasWantedCharacters(string source, string wantedCharacters)
    {
        foreach(char s in source) //One by one, loop through the characters in source
        {
            foreach(char c in wantedCharacters) //One by one, loop through the wanted characters
            {
                if (c == s)  //Is the current illegalChar here in the string?
                    return true;
            }
        }
        return false;
    }

    //Overloaded version of HasWantedCharacters
    //Checks to see if any one of the wantedCharacters is contained within the source string
    //string source ~ String to test
    //string wantedCharacters ~ string of characters to check for
    static bool HasWantedCharacters(string source, string wantedCharacters, out string capturedCharacters)
    {
        capturedCharacters = ""; //Haven't found any wanted characters yet

        foreach(char s in source)
        {
            foreach(char c in wantedCharacters) //Is the current illegalChar here in the string?
            {
                if(c == s)
                {
                    if(!capturedCharacters.Contains(c.ToString()))
                        capturedCharacters += c.ToString();  //Send these characters to whoever's asking
                }
            }
        }

        if (capturedCharacters.Length > 0)  
            return true;
        else
            return false;
    }

4
HasWantedCharacters পদ্ধতি দুটি বা তিনটি স্ট্রিং গ্রহণ করে। প্রথম স্ট্রিং আমরা নির্দিষ্ট অক্ষরগুলির জন্য যাচাই করতে চাই। দ্বিতীয় স্ট্রিং, সমস্ত অক্ষর যা আমরা প্রথমটিতে সন্ধান করব। ওভারলোডেড পদ্ধতি তৃতীয় স্ট্রিং হিসাবে কলারের (অর্থাত্ প্রধান) আউটপুট সরবরাহ করে। নেস্টেড পূর্বাভাস বিবৃতি উত্সের প্রতিটি চরিত্রের মধ্য দিয়ে যায় এবং একে একে একে তুলনা করে; সেই অক্ষরগুলির সাথে আমরা যাচাই করছি। কোনও একটি চরিত্রের সন্ধান পেলে এটি সত্য হয়। ওভারলোডেড পদ্ধতিতে চেক করা অক্ষরের সাথে মিল পাওয়া অক্ষরের একটি স্ট্রিং আউটপুট দেয়, তবে সমস্ত বের না হওয়া পর্যন্ত ফিরে আসবে না। সহায়ক?
— নাট উইলকিনস

4
কোনও সি # কনসোল প্রজেক্টটি নির্দ্বিধায় অনুভব করুন এবং প্রোগ্রামের ভিতরে কোডটি অনুলিপি করুন-প্রধান পদ্ধতিটি প্রতিস্থাপন করতে ভুলবেন না। দুটি স্ট্রিং (গুড ইউজারনেম এবং ব্যাড ইউজারনেম) এর সাথে টিঙ্কার এবং আপনি কীভাবে পদ্ধতিগুলি এবং কীভাবে কাজ করে তা দেখতে পাবেন। উদাহরণগুলি এত দীর্ঘ যে কোনও কার্যক্ষম সমাধান সরবরাহ করতে পারে যা কমা হিসাবে ডিলিটর ছাড়াই সংশোধন করা যায়। আপনার যদি এগুলির জন্য পরীক্ষা করার প্রয়োজন হয় তবে একক উদ্ধৃতি এবং ব্যাকস্ল্যাশ উপস্থাপনের জন্য এস্কপ সিকোয়েন্সগুলি কেবল একটি উপায় way
— নাট উইলকিনস


0

আপনি যদি স্বেচ্ছাসেবী স্ট্রিংগুলির সন্ধান করছেন, এবং কেবল অক্ষর নয়, আপনি ইনডেক্স অফফেনির একটি ওভারলোড ব্যবহার করতে পারেন যা নতুন প্রকল্প এনএলিব থেকে স্ট্রিং আর্গুমেন্ট গ্রহণ করে :

if (s.IndexOfAny("aaa", "bbb", "ccc", StringComparison.Ordinal) >= 0)
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.