আমাকে আমার কেস তৈরি করুন এবং তারপরে আপনি পছন্দ করেন তবে আমাকে ছিঁড়ে ফেলতে পারেন।
তুলনামূলকভাবে কথা বলা - খুব ধীর এবং স্মৃতি ক্ষুধার্ত - রেজেক্স এই সমস্যার উত্তর নয়।
স্ট্রিংবিল্ডার স্ট্রিং ম্যাংলিংয়ের চেয়ে অনেক ভাল।
যেহেতু এটি পরিপূরক করার জন্য একটি এক্সটেনশন পদ্ধতি হবে string.Replace
, তাই আমি বিশ্বাস করি যে এটি কীভাবে কাজ করে তা মিলানো গুরুত্বপূর্ণ - সুতরাং একই যুক্তির ইস্যুগুলির জন্য ব্যতিক্রম ছুঁড়ে দেওয়া গুরুত্বপূর্ণ কারণ কোনও প্রতিস্থাপন না করা থাকলে মূল স্ট্রিং ফিরিয়ে দেওয়া হয়।
আমি বিশ্বাস করি যে একটি স্ট্রিংকোম্পিয়ারি প্যারামিটার থাকা ভাল ধারণা নয়। আমি চেষ্টা করেছিলাম কিন্তু মাইকেল-লিউ দ্বারা বর্ণিত পরীক্ষার কেসটি একটি সমস্যা দেখিয়েছিল: -
[TestCase("œ", "oe", "", StringComparison.InvariantCultureIgnoreCase, Result = "")]
সূচকগুলি মিলবে, উত্সের স্ট্রিং (1) এবং ওল্ডভ্যালু.লাইনথ (2) এর ম্যাচের দৈর্ঘ্যের মধ্যে একটি মিল নেই। পুরানোভ্যালু.লেন্থকে বর্তমান ম্যাচের অবস্থানে যুক্ত করা হয়েছিল এবং আমি এর আশেপাশে কোনও উপায় খুঁজে পাইনি This রেজেেক্স যেভাবেই কেসের সাথে ম্যাচ করতে ব্যর্থ হয়েছে, তাই আমি কেবল ব্যবহারের ব্যবহারিক সমাধান নিয়েছিStringComparison.OrdinalIgnoreCase
আমার সমাধানের জন্য নিয়েছি।
আমার কোডটি অন্যান্য উত্তরের মতো তবে আমার টুইস্টটি হ'ল আমি কোনও তৈরির সমস্যায় যাওয়ার আগে কোনও ম্যাচের জন্য সন্ধান করি StringBuilder
। যদি কোনওটি পাওয়া না যায় তবে সম্ভাব্য পরিমাণে বড় বরাদ্দ এড়ানো যায়। কোডটি তখন একটি do{...}while
পরিবর্তে পরিবর্তিত হয়while{...}
আমি অন্যান্য উত্তরের বিরুদ্ধে কিছু বিস্তৃত পরীক্ষা করেছি এবং এটি ভগ্নাংশে দ্রুত বেরিয়ে এসেছিল এবং কিছুটা কম স্মৃতি ব্যবহার করেছি।
public static string ReplaceCaseInsensitive(this string str, string oldValue, string newValue)
{
if (str == null) throw new ArgumentNullException(nameof(str));
if (oldValue == null) throw new ArgumentNullException(nameof(oldValue));
if (oldValue.Length == 0) throw new ArgumentException("String cannot be of zero length.", nameof(oldValue));
var position = str.IndexOf(oldValue, 0, StringComparison.OrdinalIgnoreCase);
if (position == -1) return str;
var sb = new StringBuilder(str.Length);
var lastPosition = 0;
do
{
sb.Append(str, lastPosition, position - lastPosition);
sb.Append(newValue);
} while ((position = str.IndexOf(oldValue, lastPosition = position + oldValue.Length, StringComparison.OrdinalIgnoreCase)) != -1);
sb.Append(str, lastPosition, str.Length - lastPosition);
return sb.ToString();
}