স্ট্রিংয়ে 10 টির মধ্যে একটিতে অক্ষর রয়েছে কিনা তা পরীক্ষা করুন


107

আমি সি # ব্যবহার করছি এবং আমি স্ট্রিংয়ে দশটি অক্ষর, *, &, # ইত্যাদি ইত্যাদি রয়েছে কিনা তা পরীক্ষা করতে চাই etc.

সবচেয়ে ভালো উপায় কি?


1
আপনি কি দেখতে চান যে কোনও চরিত্র আছে কিনা, বা এতে it অক্ষরগুলির একটি "একটি" (যেমন: ঠিক একটি) রয়েছে, এবং কেবল একটি?
রিড কোপসি

উত্তর:


210

নিম্নলিখিতটি আমার দৃষ্টিতে সহজ পদ্ধতি হবে:

var match = str.IndexOfAny(new char[] { '*', '&', '#' }) != -1

অথবা পড়া সহজভাবে ফর্মটিতে:

var match = str.IndexOfAny("*&#".ToCharArray()) != -1

প্রসঙ্গ এবং প্রয়োজনীয় পারফরম্যান্সের উপর নির্ভর করে আপনি চর অ্যারে ক্যাশে করতে বা করতে চাইতে পারেন।


চর অ্যারে ইনস্ট্যান্ট করার সময়, প্রকারটি বাদ দেওয়া যেতে পারে এবং এটি অনুমান করা হবে।
প্যালেক

40

অন্যরা যেমন বলেছে, ইনডেক্স অফ ব্যবহার করুন। তবে, আমি এটি এইভাবে ব্যবহার করব:

private static readonly char[] Punctuation = "*&#...".ToCharArray();

public static bool ContainsPunctuation(string text)
{
    return text.IndexOfAny(Punctuation) >= 0;
}

এইভাবে আপনি প্রতিটি কলে একটি নতুন অ্যারে তৈরি শেষ করবেন না। স্ট্রিংটি আইএমওর একটি ধারাবাহিক অক্ষরের চেয়ে স্ক্যান করা সহজ।

অবশ্যই আপনি যদি এটি একবার ব্যবহার করতে যাচ্ছেন, তাই নষ্ট সৃষ্টি কোনও সমস্যা নয়, আপনি হয় ব্যবহার করতে পারেন:

private const string Punctuation = "*&#...";

public static bool ContainsPunctuation(string text)
{
    return text.IndexOfAny(Punctuation.ToCharArray()) >= 0;
}

অথবা

public static bool ContainsPunctuation(string text)
{
    return text.IndexOfAny("*&#...".ToCharArray()) >= 0;
}

আপনি অন্য কোথাও বিরামচিহ্নগুলি ব্যবহার করতে চান কিনা এবং পদ্ধতিটি কতবার কল হতে চলেছে তা নির্ভর করে এটি নির্ভর করে।


সম্পাদনা করুন: এখানে দুঃশ্চিন্তা একটি স্ট্রিং থাকে জন্য রিড Copsey এর পদ্ধতি বিকল্প নেই ঠিক একটি অক্ষরের।

private static readonly HashSet<char> Punctuation = new HashSet<char>("*&#...");

public static bool ContainsOnePunctuationMark(string text)
{
    bool seenOne = false;

    foreach (char c in text)
    {
        // TODO: Experiment to see whether HashSet is really faster than
        // Array.Contains. If all the punctuation is ASCII, there are other
        // alternatives...
        if (Punctuation.Contains(c))
        {
            if (seenOne)
            {
                return false; // This is the second punctuation character
            }
            seenOne = true;
        }
    }
    return seenOne;
}

আমি মনে করি পারফরম্যান্সের সমস্যা হলে এটি চরের অ্যারে ক্যাশে করা উপযুক্ত, তবে তারপরে আবার প্রসঙ্গের উপর নির্ভর করে এটি উপযুক্ত নাও হতে পারে।
নলডোরিন

1
হ্যাঁ, আপনি যদি কেবল এমন কোনও পদ্ধতিতে ব্যবহার করেন যা একবার কার্যকর করা হয় তবে এটি উপযুক্ত হবে না। যাইহোক, আমি মনে করি এটি পাঠযোগ্যতার পাশাপাশি কর্মক্ষমতাও উন্নত করে। আপনি ToCharArrayপ্রয়োজনে অবশ্যই "ইনলাইন" ফর্মটি ব্যবহার করতে পারেন ।
জন স্কিটি

1
@ ক্যানন: সেটটি কত বড়? খুব, খুব ছোট সেটগুলির জন্য, আমি অ্যারের আশা করতাম ray বড় সেটগুলির জন্য, হ্যাশসেট মাইল থেকে জিতে যাওয়ার সম্ভাবনা রয়েছে।
জন স্কিটি

5

যদি আপনি কেবল এটির কোনও অক্ষর রয়েছে কিনা তা দেখতে চান তবে আমি অন্য জায়গায় প্রস্তাবিত স্ট্রিং.ইনডেক্সঅফএনি ব্যবহারের পরামর্শ দেব।

আপনি যদি যাচাই করতে চান যে স্ট্রিংয়ে দশটি অক্ষরের একটি এবং একটি মাত্র রয়েছে , তবে এটি কিছুটা জটিল হয়ে ওঠে। আমি বিশ্বাস করি যে দ্রুততম উপায় হ'ল একটি ছেদটির বিরুদ্ধে পরীক্ষা করা, তারপরে সদৃশগুলি পরীক্ষা করা।

private static char[] characters = new char [] { '*','&',... };

public static bool ContainsOneCharacter(string text)
{
    var intersection = text.Intersect(characters).ToList();
    if( intersection.Count != 1)
        return false; // Make sure there is only one character in the text

    // Get a count of all of the one found character
    if (1 == text.Count(t => t == intersection[0]) )
        return true;

    return false;
}

হ্যাঁ - আমি মনে করি একটি একক লুপ সম্ভবত এই ক্ষেত্রে দ্রুততর হয়েছে, বিশেষত বিরামচিহ্নগুলির ছোট সেট সহ। আমি সত্যিকারের দ্রুত যা এটি দেখতে বড় স্ট্রিংগুলির সাথে এটি পরীক্ষা করার চেষ্টা করতে আগ্রহী হয়ে উঠছি।
রিড কোপসি

1
আমি মনে করি যে দুটি স্ট্রিংয়ের ছেদটি সন্ধানের ক্ষেত্রে যেভাবেই হোক চরিত্র অনুসারে চলতে হবে, সুতরাং এটি কীভাবে দ্রুত হবে তা আমি দেখতে পাচ্ছি না ... এবং আমার প্রস্তাবিত রুটটি কেবল একটি পাসও ব্যবহার করে না, তবে এটিরও রয়েছে একটি "আউট আউট" বিকল্প। ভাবুন পাঠ্যটি যদি মিলিয়ন অক্ষর দীর্ঘ হয় তবে প্রথম দুটি দুটি "*" :)
জন স্কিটি


1
var specialChars = new[] {'\\', '/', ':', '*', '<', '>', '|', '#', '{', '}', '%', '~', '&'};

foreach (var specialChar in specialChars.Where(str.Contains))
{
    Console.Write(string.Format("string must not contain {0}", specialChar));
}

0

সব কিছুর জন্য তোমাকে ধন্নবাদ! (এবং প্রধানত জোন!): এটি আমাকে এটি লেখার অনুমতি দিয়েছে:

    private static readonly char[] Punctuation = "$€£".ToCharArray();

    public static bool IsPrice(this string text)
    {
        return text.IndexOfAny(Punctuation) >= 0;
    }

যেহেতু আমি একটি নির্দিষ্ট স্ট্রিংয়ের দাম বা বাক্য, যেমন 'প্রদর্শন করা খুব কম' এর মতো সনাক্ত করার জন্য একটি ভাল উপায় সন্ধান করছিলাম।


2
আমি জানি এটি পুরানো, তবে পরিষ্কার হওয়া মুদ্রার সাথে ম্যাচ করার পক্ষে এটি খুব ভাল উপায় নয় ... আপনার যদি কেউ "কে-হা" লিখতেন তবে এটি দাম হিসাবে মিলবে ... পরিবর্তে একটি সঠিক উপায় উল্লেখ করুন : মুদ্রা এখানে সংজ্ঞায়িত সনাক্ত stackoverflow.com/questions/7214513/...
mcse3010
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.