সি # - অন্য স্ট্রিং থেকে একটি স্ট্রিংয়ের প্রথম উপস্থিতি সরানোর সহজ উপায়


88

আমাকে অন্য স্ট্রিং থেকে স্ট্রিংয়ের প্রথম (এবং শুধুমাত্র প্রথম) উপস্থিতি সরিয়ে ফেলতে হবে।

এখানে স্ট্রিং প্রতিস্থাপন একটি উদাহরণ "\\Iteration"। এই:

প্রোজেক্টনাম \\ আইট্রেশন \\ রিলিজ 1 te আইট্রেশন 1

এটি হয়ে যাবে:

প্রোজেক্টনাম \\ রিলিজ 1 \\ Iteration1

এখানে কিছু কোড যা এটি করে:

const string removeString = "\\Iteration";
int index = sourceString.IndexOf(removeString);
int length = removeString.Length;
String startOfString = sourceString.Substring(0, index);
String endOfString = sourceString.Substring(index + length);
String cleanPath = startOfString + endOfString;

এটি অনেকটা কোডের মতো মনে হচ্ছে।

সুতরাং আমার প্রশ্নটি হ'ল এটি করার কোনও ক্লিনার / আরও পাঠযোগ্য / আরও সংক্ষিপ্ত উপায় কি?

উত্তর:


155
int index = sourceString.IndexOf(removeString);
string cleanPath = (index < 0)
    ? sourceString
    : sourceString.Remove(index, removeString.Length);

10
এই উত্তরটি অ-এসসিআইআই অক্ষরের সাথে যুক্ত স্ট্রিংগুলির জন্য ভেঙে যেতে পারে। উদাহরণস্বরূপ, এন-মার্কিন সংস্কৃতির অধীনে, æএবং aeসমান হিসাবে বিবেচিত হয়। মুছে ফেলার জন্য চেষ্টা করা paediaথেকে Encyclopædiaএকটি নিক্ষেপ করা হবে ArgumentOutOfRangeExceptionযেহেতু আপনি 6 অক্ষর অপসারণ করার চেষ্টা করছেন, যখন ম্যাচিং শুধুমাত্র সাবস্ট্রিং 5. রয়েছে
ডগলাস

6
sourceString.IndexOf(removeString, StringComparison.Ordinal)ব্যতিক্রম এড়ানোর জন্য আমরা এটির মতো এটি সংশোধন করতে পারি ।
বোরিস্লাভ ইভানভ

30
string myString = sourceString.Remove(sourceString.IndexOf(removeString),removeString.Length);

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


9
যদি সরানো স্ট্রিং সোর্সস্ট্রিংয়ের মধ্যে না থাকে তবে এটি ক্রাশ হবে।
অরেগনহোস্ট

27
sourceString.Replace(removeString, "");

18
স্ট্রিং.রেপ্লেস বলেছেন যে এটি " [r] একটি নতুন স্ট্রিং যুক্ত করে যেখানে বর্তমান পরিস্থিতিতে একটি নির্দিষ্ট স্ট্রিংয়ের সমস্ত উপস্থিতি অন্য নির্দিষ্ট স্ট্রিংয়ের সাথে প্রতিস্থাপন করা হয় "। ওপিতে প্রথম ঘটনাটি প্রতিস্থাপন করতে চেয়েছিল ।
ওয়াই হা লি

6
এছাড়াও, আপনার উত্তরটি কিছুটা ব্যাখ্যা করা উচিত কারণ কেবল কোড-উত্তরগুলি গ্রহণযোগ্য নয়। অন্যান্য উত্তরগুলি দেখুন এবং কিছু টিপসের জন্য সেগুলি আপনার সাথে তুলনা করুন।
ওয়াই হা লি

11

এর জন্য একটি দ্রুত টিডিডি পরীক্ষা লিখেছিলেন

    [TestMethod]
    public void Test()
    {
        var input = @"ProjectName\Iteration\Release1\Iteration1";
        var pattern = @"\\Iteration";

        var rgx = new Regex(pattern);
        var result = rgx.Replace(input, "", 1);

        Assert.IsTrue(result.Equals(@"ProjectName\Release1\Iteration1"));
    }

rgx.Replace (ইনপুট, "", 1); "", 1 বারের সাথে প্যাটার্নের সাথে মেলে এমন কোনও কিছুর জন্য ইনপুট দেখার জন্য বলে।


4
এর মতোই আপনি সমস্যার সমাধান করেছেন। এই জাতীয় সমস্যার জন্য রেজেক্স ব্যবহার করার সময় কেবল কর্মক্ষমতা বিবেচনা করুন।
টমাস

7

আপনি মজাদার জন্য একটি এক্সটেনশন পদ্ধতি ব্যবহার করতে পারেন । সাধারণত আমি স্ট্রিংয়ের মতো সাধারণ উদ্দেশ্যে শ্রেণিতে এক্সটেনশন পদ্ধতি সংযুক্ত করার পরামর্শ দিই না, তবে আমি যেমন বলেছি এটি মজাদার। চাকাটি পুনরায় উদ্ভাবনের কোনও অর্থ নেই বলেই আমি @ লুকের উত্তর ধার নিয়েছি।

[Test]
public void Should_remove_first_occurrance_of_string() {

    var source = "ProjectName\\Iteration\\Release1\\Iteration1";

    Assert.That(
        source.RemoveFirst("\\Iteration"),
        Is.EqualTo("ProjectName\\Release1\\Iteration1"));
}

public static class StringExtensions {
    public static string RemoveFirst(this string source, string remove) {
        int index = source.IndexOf(remove);
        return (index < 0)
            ? source
            : source.Remove(index, remove.Length);
    }
}

4
আপনি সাধারণত স্ট্রিংয়ের মতো সাধারণ উদ্দেশ্য শ্রেণিতে এক্সটেনশন পদ্ধতি সংযুক্ত করার পরামর্শ দিচ্ছেন না কেন? এর কী আপস ডাউনস্টাইডস আছে?
তেউন কোইজমান

4
এ জাতীয় সাধারণ শ্রেণীর উপরে এটি খুব নির্দিষ্ট উদ্দেশ্যে কোনও এক্সটেনশন পদ্ধতি তৈরি করা সহজ। উদাহরণস্বরূপ, IsValidIBAN(this string input)স্ট্রিং এ এটি খুব নির্দিষ্ট হবে।
Squirrelkiller

3

আপনি যদি এই সমস্যাটি সমাধান করার জন্য একটি সহজ পদ্ধতি চান। (এক্সটেনশন হিসাবে ব্যবহার করা যেতে পারে)

নিচে দেখ:

    public static string RemoveFirstInstanceOfString(this string value, string removeString)
    {
        int index = value.IndexOf(removeString, StringComparison.Ordinal);
        return index < 0 ? value : value.Remove(index, removeString.Length);
    }

ব্যবহার:

    string valueWithPipes = "| 1 | 2 | 3";
    string valueWithoutFirstpipe = valueWithPipes.RemoveFirstInstanceOfString("|");
    //Output, valueWithoutFirstpipe = " 1 | 2 | 3";

@ লূকএইচ এবং @ মাইক এর উত্তর দ্বারা অনুপ্রাণিত ও সংশোধিত।

সংস্কৃতি সেটিংস সহ সমস্যাগুলি প্রতিরোধের জন্য স্ট্রিংকম্পারেশন.অর্ডিনালটি ভুলবেন না। https://www.jetbrains.com/help/resharper/2018.2/StringIndexOfIsC ثقافتস্পেসিক্ট.এইচটিএমএল


2

আমি অবশ্যই একমত যে এটি কোনও এক্সটেনশন পদ্ধতির জন্য উপযুক্ত, তবে আমি মনে করি এটি কিছুটা উন্নত করা যেতে পারে।

public static string Remove(this string source, string remove,  int firstN)
    {
        if(firstN <= 0 || string.IsNullOrEmpty(source) || string.IsNullOrEmpty(remove))
        {
            return source;
        }
        int index = source.IndexOf(remove);
        return index < 0 ? source : source.Remove(index, remove.Length).Remove(remove, --firstN);
    }

এটি কিছুটা পুনরাবৃত্তি করে যা সর্বদা মজাদার।

এখানে একটি সাধারণ ইউনিট পরীক্ষাও রয়েছে:

   [TestMethod()]
    public void RemoveTwiceTest()
    {
        string source = "look up look up look it up";
        string remove = "look";
        int firstN = 2;
        string expected = " up  up look it up";
        string actual;
        actual = source.Remove(remove, firstN);
        Assert.AreEqual(expected, actual);

    }
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.