আমার একটি চাহিদা রয়েছে যা তুলনামূলকভাবে অস্পষ্ট, তবে এটি অনুভব করে যে এটি ছাত্রলীগ ব্যবহার করে সম্ভব হওয়া উচিত be
প্রসঙ্গে, আমি নোদা সময়ের একটি তারিখ / সময়ের স্ট্রিং পার্স করছি । আমি ইনপুট স্ট্রিংয়ের মধ্যে আমার অবস্থানের জন্য একটি লজিকাল কার্সার বজায় রাখি। সুতরাং সম্পূর্ণ স্ট্রিং "3 জানুয়ারী 2013" হওয়ার পরে লজিক্যাল কার্সারটি 'জে' তে থাকতে পারে।
এখন, আমাকে সংস্কৃতির জন্য সমস্ত পরিচিত মাসের নামের সাথে তুলনা করে, মাসের নামটি পার্স করা দরকার:
- সংস্কৃতি-সংবেদনশীলভাবে
- কেস-insensitively
- কার্সারের বিন্দু থেকে (পরে নয়; আমি দেখতে চাই যে কার্সারটি প্রার্থীর মাসের নামটি "দেখছে" কিনা)
- দ্রুত
- ... এবং পরে আমার জানতে হবে কতগুলি অক্ষর ব্যবহৃত হয়েছিল
এটি করার জন্য বর্তমান কোডটি সাধারণত ব্যবহার করে কাজ করে CompareInfo.Compare
। এটি কার্যকরভাবে এর মতো (কেবল মিলের অংশের জন্য - আসল জিনিসটিতে আরও কোড রয়েছে, তবে এটি ম্যাচের সাথে প্রাসঙ্গিক নয়):
internal bool MatchCaseInsensitive(string candidate, CompareInfo compareInfo)
{
return compareInfo.Compare(text, position, candidate.Length,
candidate, 0, candidate.Length,
CompareOptions.IgnoreCase) == 0;
}
তবে এটি প্রার্থী এবং সেই অঞ্চলের উপর নির্ভর করে যা আমরা একই দৈর্ঘ্যের সাথে তুলনা করি। বেশিরভাগ সময় ভাল, তবে কিছু বিশেষ ক্ষেত্রে জরিমানা হয় না । মনে করুন আমাদের মতো কিছু রয়েছে:
// U+00E9 is a single code point for e-acute
var text = "x b\u00e9d y";
int position = 2;
// e followed by U+0301 still means e-acute, but from two code points
var candidate = "be\u0301d";
এখন আমার তুলনা ব্যর্থ হবে। আমি ব্যবহার করতে পারি IsPrefix
:
if (compareInfo.IsPrefix(text.Substring(position), candidate,
CompareOptions.IgnoreCase))
কিন্তু:
- এর জন্য আমার একটি সাবস্ট্রিং তৈরি করা দরকার, যা আমি সত্যিই বরং এড়াতে পারি। (আমি নোডা টাইমকে কার্যকরভাবে একটি সিস্টেম লাইব্রেরি হিসাবে দেখছি; পার্সিং পারফরম্যান্স কিছু ক্লায়েন্টের পক্ষে গুরুত্বপূর্ণ হতে পারে))
- কার্সার পরে কতদূর এগিয়ে যেতে হবে তা আমাকে জানায় না
বাস্তবে, আমি দৃ strongly়ভাবে সন্দেহ করি এটি খুব ঘন ঘন আসবে না ... তবে আমি এখানে সঠিক জিনিসটি করতে চাই । আমি নিজেও ইউনিকোড বিশেষজ্ঞ না হয়ে নিজে নিজে প্রয়োগ না করে এটি করতে সক্ষম হতে চাই :)
( নোডা সময় বাগ 210 হিসাবে উত্থাপিত , কেউ যদি কোনও পরিণতিতে অনুসরণ করতে চায় সে ক্ষেত্রে।)
আমি স্বাভাবিককরণের ধারণাটি পছন্দ করি। ক) নির্ভুলতা এবং খ) পারফরম্যান্সের জন্য আমাকে বিশদটি এটি পরীক্ষা করা দরকার। ধরে নিচ্ছি যে আমি এটিকে সঠিকভাবে কাজ করতে পারি, আমি এখনও নিশ্চিত নই যে এটি কীভাবে সকলের পরিবর্তনের পক্ষে মূল্যবান হবে - এটি এমন এক ধরণের জিনিস যা সম্ভবত বাস্তবে বাস্তবে আসবে না , তবে আমার সমস্ত ব্যবহারকারীর অভিনয়কে আঘাত করতে পারে: (
আমি বিসিএলও পরীক্ষা করে দেখেছি - যা এটি সঠিকভাবে পরিচালনা করতে পারে না। কোডের উদাহরণ:
using System;
using System.Globalization;
class Test
{
static void Main()
{
var culture = (CultureInfo) CultureInfo.InvariantCulture.Clone();
var months = culture.DateTimeFormat.AbbreviatedMonthNames;
months[10] = "be\u0301d";
culture.DateTimeFormat.AbbreviatedMonthNames = months;
var text = "25 b\u00e9d 2013";
var pattern = "dd MMM yyyy";
DateTime result;
if (DateTime.TryParseExact(text, pattern, culture,
DateTimeStyles.None, out result))
{
Console.WriteLine("Parsed! Result={0}", result);
}
else
{
Console.WriteLine("Didn't parse");
}
}
}
"বিএড" এর পাঠ্য মানের সাথে কাস্টম মাসের নামটি "বিছানায়" পরিবর্তন করা হয়েছে জরিমানা।
ঠিক আছে, আরও কয়েকটি তথ্য পয়েন্ট:
ব্যবহারের খরচ
Substring
এবংIsPrefix
উল্লেখযোগ্য কিন্তু ভয়ঙ্কর নয়। আমার বিকাশের ল্যাপটপে "শুক্রবার 12 এপ্রিল 2013 20:28:42" এর একটি নমুনায়, এটি আমি প্রায় 460K থেকে প্রায় 460K তে এক সেকেন্ডে সম্পাদন করতে পার্স অপারেশনগুলির সংখ্যা পরিবর্তন করে changes আমি যদি সম্ভব হয় তবে এই মন্দাটি এড়াতে চাই, তবে এটি খুব খারাপ নয়।সাধারণীকরণটি আমার যা ভাবা হয়েছিল তার চেয়ে কম সম্ভব - কারণ এটি পোর্টেবল ক্লাস লাইব্রেরিতে নেই। আমি সম্ভবত এটি কেবল নন-পিসিএল বিল্ডগুলির জন্য ব্যবহার করতে পারলাম , পিসিএল বিল্ডগুলি একটু কম সঠিক হতে দেয়। (
string.IsNormalized
) সাধারণকরণের জন্য পরীক্ষার হিট কার্যকারিতাটি প্রতি সেকেন্ডে প্রায় 445K কলে নিয়ে যায়, যা আমি বেঁচে থাকতে পারি। আমি এখনও নিশ্চিত নই যে এটি আমার যা যা করা দরকার তা করে তোলে - উদাহরণস্বরূপ, "ß" যুক্ত এক মাসের নাম অনেক সংস্কৃতিতে "এসএস" এর সাথে মেলে, আমি বিশ্বাস করি ... এবং সাধারণীকরণ এটি করে না।
text
খুব দীর্ঘ না হয়, আপনি করতে পারেন if (compareInfo.IndexOf(text, candidate, position, options) == position)
। msdn.microsoft.com/en-us/library/ms143031.aspx তবে যদি text
এটি দীর্ঘ হয় তবে এটি যেখানে প্রয়োজন তার বাইরে অনুসন্ধান করতে অনেক সময় নষ্ট করবে।
String
ক্লাসটি ব্যবহার করে কেবল বাইপাস করুন এবং সরাসরি ব্যবহার করুন । আপনি আরও কোড লেখার শেষ করবেন, তবে আপনি যখন উচ্চ পারফরম্যান্স চান তখনই তা ঘটে ... বা হতে পারে আপনার সি ++ / সিএলআই ;-) এ প্রোগ্রামিং করা উচিতChar[]